【问题标题】:Oracle: Update tree triggerOracle:更新树触发器
【发布时间】:2011-10-25 03:26:45
【问题描述】:

假设我有一张桌子,上面有 IDPARENT_ID

我想创建一个“更新时”触发器,所以每当ID 更新时,任何指向IDPARENT_ID 也会更新。

但是,我可以看到的主要问题是,我认为 Oracle 不允许您从当前正在执行触发器的表中进行选择。

我知道我可以将“更新”代码包装在 PL/SQL 函数中,但我的用户可能更愿意只使用 SQL 来处理这些数据。

在不强迫用户调用大量 PL/SQL 的情况下实现我所追求的最佳方式是什么(显然,我很高兴用 PL/SQL 实现它,只要它对用户相当透明)。

【问题讨论】:

    标签: oracle plsql triggers


    【解决方案1】:

    我最终实现了这一点,方法是将视图基于表,然后使用instead of 触发器使视图可更新。这个而不是触发器对基表中的ids 和parent_ids 进行了适当的更新。

    【讨论】:

      【解决方案2】:

      你需要一个包和两个触发器。

      第一个触发器是after update for each row。它保存在包全局变量中更新的 id。

      第二个触发器是after update trigger (without for each row)。此触发器可以从包全局变量中更新 id 的 parent_id

      【讨论】:

      • 同意。如果两个不同的会话同时更新同一父级的两个不同的子记录,请记住考虑并发问题。
      【解决方案3】:

      即使是嵌套在触发器中的 PL/SQL 也会在此处引起突变。

      这听起来像是一个规范化问题。为什么需要更新另一行?我建议查看您正在维护的值,并将其移至另一个表...

      还有一种不一定推荐的方法来绕过合法的突变...PRAGMA AUTONOMOUS_TRANSACTION - 我会留给你查一下 :)

      【讨论】:

      • +1 同意,但从技术上讲这不是规范化问题 - 而是选择自然键而不是代理项的问题。
      猜你喜欢
      • 2016-12-03
      • 2019-05-03
      • 2017-06-11
      • 1970-01-01
      • 2013-07-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多