【问题标题】:Calling Oracle autonomous stored procedure from trigger从触发器调用 Oracle 自治存储过程
【发布时间】:2011-09-30 13:57:40
【问题描述】:

我有一个 Oracle 触发器,它正在调用一个定义了 PRAGMA AUTONOMOUS_TRANSACTION 的存储过程。从触发器传递的值已经提交,但似乎这些值在存储过程中不可用?我对此并不积极,因为调试/记录/提交的能力很困难,而且输出的时间让我有点困惑。我想知道是否期望任何传递的值都可以在存储过程中使用,而不管 AUTONOMOUS_TRANSACTION 是什么? 谢谢

【问题讨论】:

    标签: oracle stored-procedures triggers


    【解决方案1】:

    作为参数传递给存储过程的值将始终可供存储过程使用。过程是否使用自治事务声明无关紧要。

    在自治事务中运行的代码无法看到调用事务所做的更改。十分之九,当人们看到他们期望的数据描述问题时,这就是问题的根源。

    如果您的存储过程除了将某些内容写入日志表之外,还执行其他操作,那么在使用自主事务时我会格外谨慎。如果您将自治事务用于日志记录以外的任何事情,那么您几乎可以肯定地使用它们不正确。而且您可能会引入大量与竞争条件和事务完整性相关的错误。

    【讨论】:

    • 表 ABC 上的触发器调用在同一个 ABC 表上执行选择的存储过程。在这种情况下,如果没有编译指示,我会从存储过程中收到“ORA-04091:表 ABC 正在变异,触发器/函数可能看不到它”错误。除了 SELECT 语句之外,存储过程中唯一的活动是在执行 INSERT/COMMIT 的异常事件中完成的日志记录。
    • @McArthey - 使用自治事务来解决变异触发器错误几乎总是一个错误。由于 SELECT 语句看不到触发语句所做的更改,这意味着您的 SELECT 应该在语句之前的触发器中完成(因为您不关心当前语句所做的更改)或者您需要更强大的解决方案。
    • 谢谢。是的,我确实不关心触发器所做的更改,但我们正在关注特定的更改。当发生更改时,将调用存储过程对行值进行一些分析。存储过程不会对相关表进行任何更新或插入。
    • @McArthey - 但是您关心触发语句所做的更改吗?我会假设您这样做,否则让触发器调用该过程似乎很奇怪。根据定义,自治事务无法看到触发语句正在进行的更改。
    • 这有点奇怪。触发器正在插入/更新通过触发器监视表 A 的辅助表(称为表 B)。触发逻辑有条件地更新表 B,它调用存储过程从表 A 上的值中进行选择,以便可以使用计算值更新表 B。这就是为什么我说存储过程不关心正在执行触发器的表中的值是什么。
    【解决方案2】:

    "触发逻辑有条件 更新表 B 调用 从存储过程中选择 表 A 上的值,以便表 B 可以 用计算值更新。 "

    也许表 B 真的应该是从表 A 派生的物化视图?我们可以在填充 MView 的查询的 WHERE 子句中构建很多复杂性。 Find out more.

    【讨论】:

      【解决方案3】:

      如果您在 table_x 上有一个行级触发器,则该触发器可以由同一语句多次触发,因为该语句会影响不同的行。

      这些行受到影响的顺序是不确定的。因此,table_x 的状态在行级触发器执行期间是不确定的。这就是引发 MUTATING TABLE 异常的原因。

      自治事务通过查看表的已提交状态(即排除该语句所做的所有更改以及事务中的其他语句)来“作弊”。

      如果您希望存储过程查看 table_x 的状态以响应该表上的活动,则需要在完成所有行更改后完成(即在语句级触发器中,而不是在行级触发器)。

      为此的设计模式通常是在行级触发器中设置一个标志(包级变量),在 AFTER 语句级触发器中检查该标志,并在必要时对其进行操作并重置它。

      【讨论】:

      • 在我的场景中,我相信 Table_A 触发器会插入到 Table_B。 Table_B AFTER 触发器将触发并执行从 Table_A 中选择并更新 Table_B 的存储过程?由于存储过程都是同一事务的一部分,我不会对存储过程有同样的问题吗?
      猜你喜欢
      • 2021-11-02
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 2019-11-10
      • 2015-05-28
      相关资源
      最近更新 更多