ORACLE更新后触发:解决ORA-04091变异表错误

时间:2011-08-02 16:26:37

标签: sql oracle plsql triggers mutating-table

我正在尝试创建一个触发器:

  create or replace trigger NAME_OF_TRIGGER
  after insert or update on table1
  REFERENCING OLD AS OLD NEW AS NEW
  for each row

在更新/插入表格时自动填写几个非必填字段。

这要求我使用从table2和table1(触发器的主题)中选择的游标。

如果不使用临时表进行值或自治事务,有没有办法避免变异表错误?

1 个答案:

答案 0 :(得分:9)

  

“有没有办法避免变异表错误而不使用   值的临时表或自治事务?“

tl; dr 没有。


变异表错误是由查询拥有触发器的表或与拥有表的外键关系中涉及的表(至少在旧版本的数据库中,不确定它是否仍然获得)引起的。

在设计合理的应用程序中,这不是必需的。这就是为什么许多人将变异表视为数据建模不良的指标。例如,突变通常与标准化不足有关。


用Jamie Zawinski的话来解释:有些人在遇到变异表异常时,会想“我知道,我会使用自治交易”。现在他们有两个问题。


有时,只需在BEFORE INSERT或UPDATE触发器中修改:NEW值或使用虚拟列即可避免错误。但是你需要发布更多细节,看看这些是否适用。

但最好的解决方法是不需要任何其他类型。