我们将进行并行测试,以将旧系统与新的闪亮版本进行比较。我们有一个Oracle数据库表A,用于存储遗留系统的数据,以及一个等效表B,用于存储新系统的数据,因此在测试期间,该数据库将被非规范化。(此外,旧版系统和表A是固定的- 不允许更改)
我想做的是允许A上不常见的DML操作传播到B,反之亦然。我从一对触发器开始,但是遇到了一个明显的问题,即当触发器运行时,表正在变异,并引发异常。
是否有处理此问题的标准方法?我读过关于是否使用dbms_scheduler的不同报告。
谢谢,
安迪
更新: 我最终避免了整个问题,并确保了所有更新A的存储过程,也更新了B的存储过程,反之亦然。
我已将Quassnoi的回答标记为已接受,因为如果将来遇到相同的问题,我会遵循他的建议。
我已经标记了JosephStyon的答案,因为我通过在表A和B上添加两个insert / update语句级别的触发器,然后根据将要运行的触发器作为主表,使用A或B作为主表,来完成其合并过程,从而使事情暂时起作用(尽管首先,我检查了合并是否会更改目标表,如果没有的话,请提前确认)。
我将在单个规范化(或非规范化)表上创建A和B作为视图,并INSTEAD OF在这些视图上创建触发器以处理DML操作。
A
B
INSTEAD OF
DML
如果查询计划的问题,它是更好地保持表的两个副本:A_underlying和B_underlying创造,就像这样的观点:
A_underlying
B_underlying
CREATE VIEW A AS SELECT * FROM A_underlying CREATE VIEW B AS SELECT * FROM B_underlying
谓词将被推入视图,并且实际表和视图的查询计划将相同。
在INSTEAD OF两个视图的触发器中,应将数据放入两个基础表中。