Oracle允許超過一個觸發器建立相同的時間點,但它從來不保證它們的執行順序。Oracle 11g觸發器語法現在包括FOLLOWS子句保證了觸發
觸發器的執行順序
組合觸發器
啟用和禁用觸發器
觸發器的執行順序
Oracle允許超過一個觸發器建立相同的時間點,但它從來不保證它們的執行順序。Oracle 11g觸發器語法現在包括FOLLOWS子句保證了觸發器的執行順序在相同時間點。下面的例子創建一張表和兩個在相同時間點觸發的觸發器
CREATE TABLE trigger_follows_test (
? id? ? ? ? ? NUMBER,
? description VARCHAR2(50)
);
?
CREATE OR REPLACE TRIGGER trigger_follows_test_trg_1
BEFORE INSERT ON trigger_follows_test
FOR EACH ROW
BEGIN
? DBMS_OUTPUT.put_line(‘TRIGGER_FOLLOWS_TEST_TRG_1 – Executed’);
END;
/
?
CREATE OR REPLACE TRIGGER trigger_follows_test_trg_2
BEFORE INSERT ON trigger_follows_test
FOR EACH ROW
BEGIN
? DBMS_OUTPUT.put_line(‘TRIGGER_FOLLOWS_TEST_TRG_2 – Executed’);
END;
/
我們插入測試表,觸發器的執行順序沒有保證。
SQL> SET SERVEROUTPUT ON
SQL> INSERT INTO trigger_follows_test VALUES (1, ‘ONE’);
TRIGGER_FOLLOWS_TEST_TRG_1 – Executed
TRIGGER_FOLLOWS_TEST_TRG_2 – Executed
?
1 row created.
?
SQL>
?
我們可以指定觸發器TRIGGER_FOLLOWS_TEST_TRG_2在TRIGGER_FOLLOWS_TEST_TRG_1之前執行通過重建使用FOLLOWS子句的TRIGGER_FOLLOWS_TEST_TRG_1得觸發器。
CREATE OR REPLACE TRIGGER trigger_follows_test_trg_1
BEFORE INSERT ON trigger_follows_test
FOR EACH ROW
FOLLOWS trigger_follows_test_trg_2
BEGIN
? DBMS_OUTPUT.put_line(‘TRIGGER_FOLLOWS_TEST_TRG_1 – Executed’);
END;
/
?
現在TRIGGER_FOLLOWS_TEST_TRG_1總是TRIGGER_FOLLOWS_TEST_TRG_2后面執行
SQL> SET SERVEROUTPUT ON
SQL> INSERT INTO trigger_follows_test VALUES (2, ‘TWO’);
TRIGGER_FOLLOWS_TEST_TRG_2 – Executed
TRIGGER_FOLLOWS_TEST_TRG_1 – Executed
?
1 row created.
?
SQL>
?
刪除測試表。
DROP TABLE trigger_follows_test;
?
組合觸發器
組合觸發器允許代碼為一個或多個時間點為特定的對象結合起來,單獨的時間點可以共享一個全局聲明部分,這種狀態在試用期間一直保持,一旦語句結束,不管執行成功還是錯誤,,觸發器狀態將被清理干凈。在以前的版本中,該類型功能只能通過定義多個觸發器和全局變量在一個單獨的包中。
組合觸發器的動作定義和其他DML觸發器相同,此外增加了 COMPOUND TRIGGER 子句。觸發器的主體是由一個可選的全局聲明部分及一個或多個計時點部分,每個可能包含一個不能維持狀態的本地聲明。
CREATE OR REPLACE TRIGGER
? FOR
? ? COMPOUND TRIGGER
?
? — Global declaration.
? g_global_variable VARCHAR2(10);
?
? BEFORE STATEMENT IS
? BEGIN
? ? NULL; — Do something here.
? END BEFORE STATEMENT;
?
? BEFORE EACH ROW IS
? BEGIN
? ? NULL; — Do something here.
? END BEFORE EACH ROW;
?
? AFTER EACH ROW IS
? BEGIN
? ? NULL; — Do something here.
? END AFTER EACH ROW;
?
? AFTER STATEMENT IS
? BEGIN
? ? NULL; — Do something here.
? END AFTER STATEMENT;
?
END
/