この必要性は、機密性の高いバイテンポラル テーブルを更新する多数のソースが存在するという事実から生じています。
これを支援するために、Richard Snodgrass による「Developing Time-Oriented Database Applications in SQL」を使用しました。
私は、各更新または挿入の後にバイテンポラル コントラクトが保持されていることをアサートするトリガーを考え出そうとしています。より具体的には、契約は主キーが有効時間とトランザクション時間の順序付けられ、順序付けられていない有効な時間連続性アサーションであることを保証します。これを分解すると、アサーションは次のようになります。
VALID_TIME
「アクティブな」タイムラインにオーバーラップがないことをアサートします。TRANSACTION_TIME
タイムラインに重複がないことをアサートします。VALID_TIME
タイムラインにギャップがないことを主張します。
「アクティブ」とは、TRANSACTION_END
値が「永遠に」のレコードを意味します(9999-12-31)
。
これが私がこれまでに持っているものです:
CREATE OR REPLACE TRIGGER TRIGGER_NAME
AFTER INSERT OR UPDATE
ON SOME_TABLE
DECLARE
ROWCOUNT INTEGER;
BEGIN
SELECT COUNT(*) INTO ROWCOUNT
FROM SOME_TABLE T1,SOME_TABLE T2
WHERE T1.PK_COLUMN2 = T2.PK_COLUMN2
AND T1.PK_COLUMN1 = T2.PK_COLUMN1
AND T1.TRANSACTION_START < T2.TRANSACTION_END
AND T2.TRANSACTION_START < T1.TRANSACTION_END
AND T1.ROWID != T2.ROWID;
IF (ROWCOUNT>0) THEN
RAISE_APPLICATION_ERROR(-20001, 'BITEMPORAL INTEGRITY TRIGGER CHECK : AUDIT_TIME OVERLAP');
END IF;
SELECT COUNT(*) INTO ROWCOUNT
FROM SOME_TABLE T1,SOME_TABLE T2
WHERE T1.PK_COLUMN2 = T2.PK_COLUMN2
AND T1.PK_COLUMN1 = T2.PK_COLUMN1
AND T1.VALID_START < T2.VALID_END
AND T2.VALID_START < T1.VALID_END
AND T1.TRANSACTION_END = DATE '9999-12-31'
AND T2.TRANSACTION_END = DATE '9999-12-31'
AND T1.ROWID != T2.ROWID;
IF (ROWCOUNT>0) THEN
RAISE_APPLICATION_ERROR(-20001, 'BITEMPORAL INTEGRITY TRIGGER CHECK : ACTIVE VALID_TIME OVERLAP');
END IF;
SELECT COUNT(*) INTO ROWCOUNT
FROM SOME_TABLE S, SOME_TABLE T2
WHERE S.VALID_END < T2.VALID_START
AND S.PK_COLUMN1 = T2.PK_COLUMN1
AND S.PK_COLUMN2 = T2.PK_COLUMN2
AND S.TRANSACTION_END = DATE '9999-12-31'
AND T2.TRANSACTION_END = DATE '9999-12-31'
AND NOT EXISTS (
SELECT *
FROM SOME_TABLE T3
WHERE T3.PK_COLUMN1 = S.PK_COLUMN1
AND T3.PK_COLUMN2 = S.PK_COLUMN2
AND (((T3.VALID_START <= S.VALID_END)
AND (S.VALID_END < T3.VALID_END))
OR ((T3.VALID_START < T2.VALID_START)
AND (T2.VALID_START <= T3.VALID_END)))
AND T3.TRANSACTION_END = DATE '9999-12-31');
IF (ROWCOUNT>0) THEN
RAISE_APPLICATION_ERROR(-20001, 'BITEMPORAL TRIGGER CHECK : ACTIVE VALID_TIME CONTINUITY VIOLATED (GAPS)');
END IF;
END;
PK_COLUMN(s)
は自然キーの構成要素であり、残りは明らかなはずです。
質問は次のとおりです。
考えられるすべてのシナリオを含めましたか? 確認するのを忘れた追加の契約はありますか?
おまけの質問ですが、バイテンポラル データ アーキテクチャに関する他の堅実な書籍やリソースをお勧めできますか?
//リーチを拡大するために、いくつかのタグを追加しました...
コメント、提案、建設的な批評は大歓迎です。
前もって感謝します、
マット。