2011-11-29 29 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。使用這個我們可以控制執行順序。