小编典典

在Oracle中保持表同步

sql

我们将进行并行测试,以将旧系统与新的闪亮版本进行比较。我们有一个Oracle数据库表A,用于存储遗留系统的数据,以及一个等效表B,用于存储新系统的数据,因此在测试期间,该数据库将被非规范化。(此外,旧版系统和表A是固定的-
不允许更改)

我想做的是允许A上不常见的DML操作传播到B,反之亦然。我从一对触发器开始,但是遇到了一个明显的问题,即当触发器运行时,表正在变异,并引发异常。

是否有处理此问题的标准方法?我读过关于是否使用dbms_scheduler的不同报告。

谢谢,

安迪

更新: 我最终避免了整个问题,并确保了所有更新A的存储过程,也更新了B的存储过程,反之亦然。

我已将Quassnoi的回答标记为已接受,因为如果将来遇到相同的问题,我会遵循他的建议。

我已经标记了JosephStyon的答案,因为我通过在表A和B上添加两个insert /
update语句级别的触发器,然后根据将要运行的触发器作为主表,使用A或B作为主表,来完成其合并过程,从而使事情暂时起作用(尽管首先,我检查了合并是否会更改目标表,如果没有的话,请提前确认)。


阅读 179

收藏
2021-03-23

共1个答案

小编典典

我将在单个规范化(或非规范化)表上创建AB作为视图,并INSTEAD OF在这些视图上创建触发器以处理DML操作。

如果查询计划的问题,它是更好地保持表的两个副本:A_underlyingB_underlying创造,就像这样的观点:

CREATE VIEW A
AS
SELECT  *
FROM    A_underlying

CREATE VIEW B
AS
SELECT  *
FROM    B_underlying

谓词将被推入视图,并且实际表和视图的查询计划将相同。

INSTEAD OF两个视图的触发器中,应将数据放入两个基础表中。

2021-03-23