【发布时间】:2011-11-29 23:32:12
【问题描述】:
在一张桌子上有两个触发器。当表中的每一行都有插入或更新时,将执行一个触发器。当表中的每一行都有更新时,将执行第二个触发器。在 ORACLE 10G 中,当表中的一行有更新语句时,哪个触发器首先执行。 oracle中的触发器有执行顺序吗?如果可以,我该如何设置?
【问题讨论】:
标签: sql oracle plsql oracle10g
在一张桌子上有两个触发器。当表中的每一行都有插入或更新时,将执行一个触发器。当表中的每一行都有更新时,将执行第二个触发器。在 ORACLE 10G 中,当表中的一行有更新语句时,哪个触发器首先执行。 oracle中的触发器有执行顺序吗?如果可以,我该如何设置?
【问题讨论】:
标签: sql oracle plsql oracle10g
触发器的触发顺序是任意的,不是您在 10g 中可以控制的。我相信,从技术上讲,它是按照碰巧创建触发器的顺序进行的,但这当然不是您想要指望的。
在 11g 中,您可以控制触发器的触发顺序。但是,最好用一个调用两个存储过程的触发器替换这两个触发器。所以而不是
CREATE TRIGGER trg_1
BEFORE UPDATE ON t
FOR EACH ROW
BEGIN
<<do thing 1>>
END;
CREATE TRIGGER trg_2
BEFORE UPDATE ON t
FOR EACH ROW
BEGIN
<<do thing 2>>
END;
你会得到更好的服务
CREATE PROCEDURE p1( <<arguments>> )
AS
BEGIN
<<do thing 1>>
END;
CREATE PROCEDURE p2( <<arguments>> )
AS
BEGIN
<<do thing 2>>
END;
CREATE TRIGGER trg
BEFORE UPDATE ON t
FOR EACH ROW
BEGIN
p1( <<list of arguments>> );
p2( <<list of arguments>> );
END;
【讨论】:
对于 11g 之前的版本,不,未指定顺序。来自10g Release 2 docs:
对于启用的触发器,Oracle 会自动执行以下操作:
当单个 SQL 语句触发多个触发器时,Oracle 会按计划的触发顺序运行每种类型的触发器。首先,触发语句级触发器,然后触发行级触发器。
Oracle 在设定的时间点针对不同类型的触发器执行完整性约束检查,并保证触发器不会损害完整性约束。
Oracle 为查询和约束提供读一致性视图。
Oracle 管理触发器动作代码中引用的触发器和模式对象之间的依赖关系
如果触发器更新分布式数据库中的远程表,Oracle 使用两阶段提交。
如果给定语句存在多个相同类型的触发器,Oracle 会以未指定的随机顺序触发多个触发器;也就是说,同一语句的同一类型的触发器不能保证以任何特定的顺序触发。
【讨论】:
在 10g 中超出正常的 before 语句、before row、after row、after 语句顺序,可以不依赖触发触发的顺序。在 11g 中,CREATE TRIGGER statement 中添加了一个新的 FOLLOWS 子句。
【讨论】:
在 Oracle 10g 中,我们不控制在同一时间创建的触发器。它是随机执行的。所以我们不能说哪个触发器首先被触发。为了克服这个问题,Oracle 11g 引入了FOLLOWS CLAUSE。使用它我们可以控制执行顺序。
【讨论】: