双时态完整性检查

时间:2015-07-24 21:16:35

标签: oracle database-design data-structures triggers bi-temporal

对此的需求来自于这样一个事实,即我们现在有许多来源更新敏感的双时态表,我们有点警觉并希望掩盖我们的背后。

我使用Richard Snodgrass的“在SQL中开发面向时间的数据库应用程序”来帮助我。

我一直试图想出一个触发器,断言每次更新或插入后都会保留双时态合约。更具体地说,合同确保主键是有效时间和事务时间顺序,以及非顺序有效时间连续性断言。在打破这个断言后,断言如下:

  1. 断言“有效”VALID_TIME时间线没有重叠。

  2. 断言TRANSACTION_TIME时间轴中没有重叠。

  3. 断言VALID_TIME时间轴中没有间隙。

  4. “有效”是指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)是自然键的元素,休息应该是显而易见的。

    问题如下:

    我是否包含了所有可能的情况?是否有额外的合同,我忘了检查?

    奖金问题,您能否推荐关于双时态数据架构的任何其他实用书籍/资源?

    //添加了一些标签,以获得更大的覆盖面......

    欢迎任何评论,建议和建设性批评。

    提前致谢,

0 个答案:

没有答案