sql - 在 Oracle 中保持表同步

标签 sql oracle synchronization triggers denormalization

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

我想要做的是允许 A 上不频繁的 DML 操作传播到 B,反之亦然。我开始使用一对触发器来执行此操作,但遇到了一个明显的问题,即当触发器运行时,表会发生变化,并且会引发异常。

有处理这个问题的标准方法吗?我已经阅读了关于使用 dbms_scheduler 是否可行的不同报告......

谢谢,

安迪

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

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

我已经标记了 JosephStyon 的答案,因为我通过在表 A 和 B 上添加两个插入/更新语句级触发器,然后使用 A 或 B 作为主表执行他的合并过程,这取决于哪个触发器运行(尽管首先,我检查了目标表是否会因合并而改变,否则就提前退出)。

最佳答案

我会创建 AB作为对单个规范化(或非规范化)表的 View ,并创建了一个 INSTEAD OF触发这些 View 来处理 DML操作。

如果查询计划很重要,最好保留两个表副本:A_underlyingB_underlying并像这样创建 View :

CREATE VIEW A
AS
SELECT  *
FROM    A_underlying

CREATE VIEW B
AS
SELECT  *
FROM    B_underlying

谓词将被推送到 View 中,并且实际表和 View 的查询计划将是相同的。

INSTEAD OF在两个 View 上触发,您应该将数据放入两个基础表中。

关于sql - 在 Oracle 中保持表同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/965321/

相关文章:

PHP - 具有未知数量参数的安全 PDO 准备好的语句

oracle - 从 Oracle 数据文件恢复数据库

SQL Group by Having > 1

mysql - SQL - 加入 3 个表有点困惑

oracle - 如何在文件系统上创建目录?

java - 使用多线程在java中创建骰子游戏

Javascript:如何制作同步循环?

java - Spring中的同步事务方法

用于解析/识别但不针对数据库执行 SQL 的 Java API

java - Oracle ojdbc8 12.2.0.1 被 Maven 禁止