6

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

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

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

谢谢,

安迪

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

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

我已经标记了 JosephStyon 的答案,因为我通过在表 A 和 B 上添加两个插入/更新语句级触发器来简单地工作,然后使用 A 或 B 作为主表执行合并过程,具体取决于运行的触发器(尽管首先我检查了目标表是否会被合并更改,如果没有则提前退出)。

4

4 回答 4

3

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

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

CREATE VIEW A
AS
SELECT  *
FROM    A_underlying

CREATE VIEW B
AS
SELECT  *
FROM    B_underlying

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

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

于 2009-06-08T15:13:17.923 回答
1

您真的是指 DDL,而不是 DML?

使用 DML,您可以查看 Oracles Multi Master Replication以保持表同步,或者您也可以查看用于此目的的工具SymmetricDS 。

使用 DDL,我知道的唯一解决方案是Oracle 高级复制

于 2009-06-08T15:18:53.620 回答
1

将以下三个语句放入存储过程中,然后根据需要将其作为计划作业运行:

--Assume that "A" is a master, and "B" needs to be synched

--If no match in "A", delete from "B"
DELETE FROM B
WHERE NOT EXISTS(
                SELECT *
                FROM A
                WHERE A.PRIMARY_KEY = B.PRIMARY_KEY
                );

--If there is a match, but they are different, then update "B"
update 
  (
  select
    a.field1 as new_value1
   ,b.field1 as old_value1
   ,a.field2 as new_value2
   ,b.field2 as old_value2
   ,....
   ,a.fieldN as new_valueN
   ,b.fieldN as old_valueN
  from
    a
   ,b
 where a.primary_key = b.primary_key
 )
set
  old_value1 = new_value1
 ,old_value2 = new_value2
 ,....
 ,old_valueN = new_valueN;


--if the record is new to "A", then insert it into "B"
INSERT INTO B
SELECT *
FROM A 
WHERE NOT EXISTS(
                SELECT *
                FROM B 
                WHERE B.PRIMARY_KEY = A.PRIMARY_KEY
                );
于 2009-06-08T15:21:55.330 回答
1

Oracle 10g 及更高版本已将变更通知实现为异步过程。它是自动的,并且该软件包包含在 Oracle 10g 及更高版本的服务器安装中。

你可以在这里看到一些信息。

于 2009-06-08T15:22:00.790 回答