在桌面上有两个触发器。当表中的每一行都有插入或更新时,将执行一个触发器。当表中的每一行都有更新时,将执行第二次触发。当表中的行上有更新语句时,首先在ORACLE 10G中执行哪个触发器。在oracle中是否有任何触发器执行顺序?如果是这样我怎么设置它?
答案 0 :(得分:4)
对于11g之前的版本,不,订单未指定。来自 10g Release 2 docs :
对于启用的触发器,Oracle会自动执行以下操作:
当单个SQL语句触发多个触发器时,Oracle会在计划的触发序列中运行每种类型的触发器。首先,触发语句级触发器,然后触发行级触发器。
Oracle针对不同类型的触发器在设定的时间点执行完整性约束检查,并保证触发器不会损害完整性约束。
Oracle为查询和约束提供了读一致的视图。
Oracle管理触发器操作代码中引用的触发器和架构对象之间的依赖关系
如果触发器更新分布式数据库中的远程表,Oracle将使用两阶段提交。
如果给定语句存在多个相同类型的触发器,则Oracle会以未指定的随机顺序触发多个触发器;也就是说,不保证以相同的顺序触发相同类型的相同类型的触发器。
答案 1 :(得分:4)
触发器触发的顺序是任意的,而不是你可以在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;
答案 2 :(得分:3)
在正常的before语句之前,行之前,之后,语句顺序之后的10g中,不能依赖触发触发的命令。在11g中,CREATE TRIGGER statement添加了一个新的FOLLOWS子句。
答案 3 :(得分:-1)
在Oracle 10g中,我们不控制在相同时间创建的触发器。它是随机执行的。所以我们不能说先触发哪个触发器。为了解决这个问题,Oracle 11g引入了FOLLOWS CLAUSE
。使用它我们可以控制执行顺序。