【问题标题】:ORACLE After update trigger: solving ORA-04091 mutating table errorORACLE After update trigger: 解决 ORA-04091 mutating table 错误
【发布时间】:2011-10-18 10:09:25
【问题描述】:

我正在尝试创建触发器:

  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(触发器的主题)中选择的游标。

在不使用临时表作为值或自治事务的情况下,有什么方法可以避免变异表错误?

【问题讨论】:

    标签: sql oracle plsql triggers mutating-table


    【解决方案1】:

    “有没有什么办法可以避免变异表错误而不使用 值的临时表还是自治事务?”

    tl;dr 没有。


    mutating table 错误是由于查询拥有触发器的表,或者与拥有表有外键关系的表(至少在旧版本的数据库中,不确定是否仍然获得)。

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


    套用 Jamie Zawinski 的话说:有些人在遇到 mutating table 异常时会想“我知道,我会使用自治事务”。现在他们有两个问题。


    有时可以通过简单地修改 BEFORE INSERT OR UPDATE 触发器中的 :NEW 值或使用虚拟列来避免错误。但是您需要发布更多详细信息以查看这些是否适用。

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

    【讨论】:

    • 谢谢!这证实了我一直在阅读的所有实验。我现在正在更改前触发器上的 :new 值;似乎有效!
    • 嗯,理论上这很好,但是当你想在复杂的连接中使用那个变异表时你会怎么做?有第二个临时表,您将触发器的数据填充到其中,然后在连接中使用该临时表?当你有数百个这样的桌子时你会怎么做?将您的架构翻倍,并为每个查询提供多个版本,以应对当前发生变异的任何连接表的所有可能性……还是使用动态 SQL?
    • 所以要么 Oracle 触发器有点毫无价值......要么我是 - 猜测后者可能是有效的,但变异触发器错误是一个皇家皮塔。
    • @RichBianco - 触发器可能毫无价值,或者至少通常仅在少数用例中有用,这可能是真的。大多数情况下,变异表会提醒我们数据模型或业务流程中的问题。
    猜你喜欢
    • 2023-01-26
    • 1970-01-01
    • 2015-12-19
    • 2018-07-14
    • 2012-05-17
    • 2018-11-30
    • 2016-03-07
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多