当前位置: 首页 > 面试题库 >

在Oracle中保持表同步

袁恩
2023-03-14
问题内容

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

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

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

谢谢,

安迪

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

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

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


问题答案:

我将在单个规范化(或非规范化)表上创建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两个视图的触发器中,应将数据放入两个基础表中。



 类似资料:
  • 我想像这里一样堆叠两个不同的XYChart。 然而,在本例中,轴的边界是相同的,数据是静态的。 在我的例子中,我有动态数据要绘制:新值在数据序列可用时添加到数据序列中。因此,当新数据到达时,y轴(例如)会更新。 此外,这两个数据集并不完全在同一范围内。 这是第一次尝试: 结果看起来像这样: Y轴看起来不太好:有两个轴,由于它们不再具有相同的边界,因此无法正确覆盖。 下一个尝试包括创建一个轴,并将其

  • FreeBSD 的 Ports Collection 在持续地进行修改。 这里提供了一些关于如何保持同步的信息。 14.1. FreshPorts 最简单的了解已经被 commit 到 ports 中的更新的方法, 是订阅 FreshPorts。 您可以选择多个 ports 并对其进行监视。 强烈建议维护人员订阅它, 这样就不仅能接收到他们自己所做的修改, 而且能看到其它 FreeBSD comm

  • SVN 使用唯一的中央仓库作为开发者之间沟通的桥梁,在开发者的工作拷贝和中央仓库之间传递变更集合(changeset),协作得以发生。这和Git的协作模型有所不同,Git 给予每个开发者一份自己的仓库拷贝,拥有自己完整的本地历史和分支结构。用户通常共享一系列的提交而不是单个变更集合。Git 允许你在仓库间共享整个分支,而不是从工作副本提交一个差异集合到中央仓库。 下面的命令让你管理仓库之间的连接,

  • 单链表的定义: 如果我想从头到尾逐个打印节点值,我需要使用head=head.next迭代直到head==null。在这种情况下,我们永远无法在打印后返回到head(value=1)节点。我的问题是如何在遍历单链表时保持头部?

  • 问题内容: 我正在尝试使用LinkedList属性持久化一个类,但似乎无法正确处理。这是我的代码和映射: hibernate映射: 看来我可以像这样持久化Class Stuff的对象,但是当我尝试恢复它们时,发生以下错误: 问题答案: 通常,Hibernate将为集合提供其自己的实现,因此您应首选接口而非特定的实现。它可能正在尝试为图像分配其他类型的列表,但失败了。您必须将字段更改为。

  • 问题内容: 在我的作业中,第三步是调用方法merge来合并list1中的两个列表,以便list1 保持排序。 我编写了代码,但效果不佳,输出显示错误,因为排序很重要 问题答案: 假设两个列表都已排序,则只需要一个循环: 如果未排序,则需要两个循环: