Oracle 冲突触发器-变异表

Oracle 冲突触发器-变异表,oracle,plsql,triggers,mutating-table,Oracle,Plsql,Triggers,Mutating Table,我对Oracle中的变异表有问题。我有两张表,Customer和Person。在修改人员行期间,我必须更新客户中的更改日期,因此我创建了一个触发器。不幸的是,Customer上有一个触发器,在某些情况下会更新Person,这会导致表的变化问题。幸运的是,如果此更改是由客户更改引起的,则在更新人员时,我不必更新客户.ChangeDate 因此,我的问题是:我如何识别个人触发器是由客户触发器触发的?变异表错误几乎总是表明数据模型或相关业务流程存在问题。最常见的原因是非规范化,即一个表中的数据以某种方

我对Oracle中的变异表有问题。我有两张表,
Customer
Person
。在修改
人员
行期间,我必须更新
客户
中的
更改日期
,因此我创建了一个触发器。不幸的是,
Customer
上有一个触发器,在某些情况下会更新
Person
,这会导致表的变化问题。幸运的是,如果此更改是由
客户
更改引起的,则在更新
人员
时,我不必更新
客户.ChangeDate


因此,我的问题是:我如何识别
个人
触发器是由
客户
触发器触发的?

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

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


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

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

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


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

@APC完全正确

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

您还可以在触发器执行子句中输入WHEN条件


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

@APC是完全正确的

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

您还可以在触发器执行子句中输入WHEN条件


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

最后,我使用了
全局临时表,并在提交后清除:

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
  column1  NUMBER,
  column2  NUMBER
) ON COMMIT DELETE ROWS;

最后,我使用了
全局临时表
,并在提交后清除:

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
  column1  NUMBER,
  column2  NUMBER
) ON COMMIT DELETE ROWS;

客户
必须更新
人员
的“某些情况”是否包括仅修改
变更日期
的情况,就像直接更新
人员
的情况一样?发布两个触发器的代码和两个表的结构可能会有帮助。嗨,Alex,不幸的是,直到周一我才能粘贴触发器的代码,但是我知道如果只修改了
changedate
,那么
person
就不会更新。客户必须更新
person
的“某些情况”是否包括只修改
changedate
的情况,就像直接更新
person
的情况一样?发布两个触发器的代码和两个表的结构可能会有帮助。嗨,Alex,不幸的是,直到星期一我才能粘贴触发器的代码,但我知道如果只修改了
changedate
,那么
person
就不会更新。