关于触发顺序

时间:2011-11-29 23:32:13

标签: sql oracle plsql oracle10g

在桌面上有两个触发器。当表中的每一行都有插入或更新时,将执行一个触发器。当表中的每一行都有更新时,将执行第二次触发。当表中的行上有更新语句时,首先在ORACLE 10G中执行哪个触发器。在oracle中是否有任何触发器执行顺序?如果是这样我怎么设置它?

4 个答案:

答案 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。使用它我们可以控制执行顺序。