2

この必要性は、機密性の高いバイテンポラル テーブルを更新する多数のソースが存在するという事実から生じています。

これを支援するために、Richard Snodgrass による「Developing Time-Oriented Database Applications in SQL」を使用しました。

私は、各更新または挿入の後にバイテンポラル コントラクトが保持されていることをアサートするトリガーを考え出そうとしています。より具体的には、契約は主キーが有効時間とトランザクション時間の順序付けられ、順序付けられていない有効な時間連続性アサーションであることを保証します。これを分解すると、アサーションは次のようになります。

  1. VALID_TIME「アクティブな」タイムラインにオーバーラップがないことをアサートします。

  2. TRANSACTION_TIMEタイムラインに重複がないことをアサートします。

  3. 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)は自然キーの構成要素であり、残りは明らかなはずです。

質問は次のとおりです。

考えられるすべてのシナリオを含めましたか? 確認するのを忘れた追加の契約はありますか?

おまけの質問ですが、バイテンポラル データ アーキテクチャに関する他の堅実な書籍やリソースをお勧めできますか?

//リーチを拡大するために、いくつかのタグを追加しました...

コメント、提案、建設的な批評は大歓迎です。

前もって感謝します、

マット。

4

0 に答える 0