2011-11-29 28 views
3

在表上有两个触发器。当表格中的每一行都有插入或更新时,会执行一个触发器。当表中的每一行有更新时执行第二个触发器。当表中一行有更新语句时,哪个触发器首先在ORACLE 10G中执行。在oracle中是否有触发器的执行顺序?如果是这样,我该如何设置它?关于触发序列

回答

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; 
+0

非常感谢信息 – Arav

+0

和建议 – Arav

3

无法触发触发的命令可以依赖于10g之前的正常语句之前,之前的行,之后的行,之后的语句顺序。在11g中,CREATE TRIGGER statement增加了一个新的FOLLOWS子句。

+0

非常感谢信息 – Arav

4

对于11g之前的版本,不,订单未指定。从10g Release 2 docs:当一个以上的触发是由一个单一发射

  • Oracle在有计划的点火顺序每种类型的触发器:

    对于启用触发器,Oracle将自动执行下列操作SQL语句。首先,触发语句级触发器,然后触发行级触发器。

  • Oracle针对不同类型的触发器在设定的时间点执行完整性约束检查,并确保触发器不会损害完整性约束。

  • Oracle为查询和约束提供了读一致视图。

  • 甲骨文管理所述触发动作的代码中引用触发器和模式对象之间的依赖性

  • Oracle使用两阶段提交,如果一个触发器中的分布式数据库更新远程表。

  • 如果给定语句存在多于一个相同类型的触发器,Oracle会触发未指定的随机顺序的多个触发器;也就是说,相同语句的相同类型的触发器不保证以任何特定顺序触发。

+0

非常感谢信息 – Arav

-1

在Oracle 10g中,我们不控制是在同一时刻所生成的触发器。它是随机执行的。所以我们不能说首先触发哪个触发器。为了克服这个问题,Oracle 11g引入了FOLLOWS CLAUSE。使用这个我们可以控制执行顺序。