在 pl/sql 中手动排序触发器触发

Posted

技术标签:

【中文标题】在 pl/sql 中手动排序触发器触发【英文标题】:Manually ordering trigger firing in pl/sql 【发布时间】:2014-04-25 02:03:05 【问题描述】:

我在表 A 上有表 A 和 4 行级别 Before Insert 触发器。 触发触发的顺序是什么? 是运行时间决定的吗? 我们可以订购触发器触发吗?触发器 2 然后触发器 4 然后触发器 3 然后触发器 1?

【问题讨论】:

@EatAPeach 建议的FOLLOWS 答案是按照您的实际要求进行操作的方法。然而,从应用程序架构的角度来看,几乎可以肯定的是,在插入触发器之前有一个单独的行级更有意义,它调用 4 个单独的过程来执行 4 个触发器本来可以执行的任何操作。在极少数情况下,拥有多个相同类型的触发器是有意义的。 【参考方案1】:

从documentation 开始,所有相同类型的触发器在执行不同类型的触发器之前。如果同一张表上有多个相同类型的触发器,数据库会选择一个任意的、不可预知的顺序。

如果您希望它以明确的顺序执行,您应该使用FOLLOWS 子句。

CREATE OR REPLACE TRIGGER2
BEFORE INSERT
ON TEST_TABLE
FOR EACH ROW

CREATE OR REPLACE TRIGGER4
BEFORE INSERT
ON TEST_TABLE
FOR EACH ROW
FOLLOWS TRIGGER2

CREATE OR REPLACE TRIGGER3
BEFORE INSERT
ON TEST_TABLE
FOR EACH ROW
FOLLOWS TRIGGER4

【讨论】:

请注意,FOLLOWS 仅从 11.1 开始存在。在此之前,没有办法以声明方式强制相同类型的触发器以特定顺序运行。

以上是关于在 pl/sql 中手动排序触发器触发的主要内容,如果未能解决你的问题,请参考以下文章

如何创建在 PL/SQL 中更新后触发的触发器

在触发器 PL/SQL 中调用存储过程

Oracle 12 PL/SQL 在触发器中检索存储过程名称

PL/SQL 触发器以防止插入

PL/SQL 触发器在插入语句之前检查值

带有动态 sql 的 PL/SQL 触发器