对此的需求来自于这样一个事实,即我们现在有许多来源更新敏感的双时态表,我们有点警觉并希望掩盖我们的背后。
我使用Richard Snodgrass的“在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)
是自然键的元素,休息应该是显而易见的。
问题如下:
我是否包含了所有可能的情况?是否有额外的合同,我忘了检查?
奖金问题,您能否推荐关于双时态数据架构的任何其他实用书籍/资源?
//添加了一些标签,以获得更大的覆盖面......
欢迎任何评论,建议和建设性批评。
提前致谢,
太