0

我对 Oracle 中的变异表有疑问。我有两张桌子,CustomerPerson。我必须在修改行期间更新ChangeDateCustomer所以Person我创建了一个触发器。不幸的是,在某些情况下有一个Customer更新的触发器,这导致了变异表问题。幸运的是,如果此更改是由更改引起的,则在更新时Person我不必更新。Customer.ChangeDatePersonCustomer

所以这是我的问题:我如何识别Person触发器是由Customer触发器触发的?

4

3 回答 3

4

变异表错误几乎总是表明数据模型或相关业务流程存在问题。最常见的原因是非规范化,即一个表中的数据以某种方式复制到另一个表中。这里似乎就是这种情况 - 您的 CUSTOMER 表包含有关另一个表 PERSON 的元数据。只是它被另一个方向的级联信息复杂化了。

解决这种情况的正确方法是整理数据模型。CUSTOMER 是 PERSON 的子类型还是相反?确定哪个是父级,哪个是子级,并确保信息只流向一个方向:可能从超类型到子类型。尽管更好的解决方案是完全删除数据传播。

有一些变通方法,但它们涉及应用更改的包和其他设计。

于 2012-02-17T12:53:21.647 回答
0

最后,我global temporary table在提交后用于清除:

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
  column1  NUMBER,
  column2  NUMBER
) ON COMMIT DELETE ROWS;
于 2012-02-22T14:00:08.220 回答
0

@APC 是完全正确的。

我会通过记住我无法协商对数据模型的更正的时间做出一些妥协。在这种情况下,您可能希望使用包内的变量来让一个触发器向另一个触发器发出信号。

您还可以将 WHEN 条件放在触发器执行子句中。

最后,如果您感觉自己像个真正的黑客,您可以询问 PL/SQL 调用堆栈并在那里寻找其他触发器。

于 2012-02-17T14:12:07.807 回答