觸發器的格式:
CREATE [OR REPLACE ] TRIGGER trigger_name {BEFORE| AFTER} {UPDATE| INSERT| DELETE|SELECT} ON table_name [FOR EACH ROW]
[FOLLOWS another_trigger] [ENABLE| DISABLE] [WHEN condition] DECLARE xxxx; BEGIN NULL; [EXCEPTION] END;
這是一般的觸發器格式。
BEFORE|AFTER:選擇觸發器在 DML操作之前還是之后發生。
不知道觸發器能不能夠對 SELECT 起作用,應該可以的。
FOR EACH ROW:指定行觸發器,只適用於UPDATE,INSERT,DELETE。
FOLLOWS,指定觸發器的順序,11g 以后使用的。
ENABLE|DISABLE:指定觸發器啟用還是禁用。(默認啟動)
或者通過下列語句
ALTER TRIGGER trigger_name {ENABLE|DISABLE};
WHEN:指定執行觸發器時必須要滿足的條件。
一個表被刪除,則定義在這表上的觸發器也會被刪除。
注意:
1.觸發器也許不會執行事務控制語句,e.g.COMMIT、SAVEPOINT、ROLLBACK.當觸發器執行是,所有執行的操作會稱為事務的一部分。當事務被提交或滾回,觸發器的才做也會提交或滾回。如果想跳出此規則可以通過 自治事務。
2.觸發器調用任何的函數或者過程也許不會執行事務控制語句。除非包含 自治事務。
3.不允許在觸發器中聲明LONG 或者 LONG RAW 變量。
觸發器中包含兩個偽記錄,分別為 :NEW 、 :OLD,使用時包括冒號,用於標識新的數據(INSERT時的)、舊的數據(delete時的)或者UPDATE則兩者都有。邏輯上不存在時被設置為 NULL
這兩者可以看做RECORD 使用。
觸發器中提供布爾函數檢查觸發的是DML中何種狀態,如下:
CREATE TRIGGER trigger_name AFTER UPDATE OR DELETE ON table_name DECLARE v_type VARCHAR(20); BEGIN IF UPDATING THEN v_type := 'updating' ; ELSIF DELETING THEN v_type := 'deleting'; END IF; xxxxxxx; END;
自治事務:
由其他事務(通常稱為主事務)發起的獨立事務。也就是說,自治事務也許會執行多個DML語句,並且提交或者滾回操作,而不會提交或者滾回主事務執行的DML語句。
例子:
有一個觸發器,在table 執行UPDATE 之后被觸發,以記錄審計數據。假設你希望即使主事務失敗,仍舊能夠記錄審計數據(即觸發器操作仍然有效)。這樣可以通過 自治事務實現。
語法:
CREATE OR REPLACE TRIGGER trigger_name AFTER UPDATE ON table_name DECLARE xx; PRAGMA AUTONOMOUS_TRANSACTION; BEGIN xx; COMMIT; END;
PRAGMA AUTONOMOUS_TRANSACTION; 和 COMMMIT; 語句是必須的。
代替觸發器(INSTEAD OF 觸發器)
代替觸發器定義於視圖
CREATE OR REPLACE trigger_name INSTEAD OF DELETE ON table_name BEGIN xxxx; END;
假如在一個視圖上進行刪除操作,但是有完整性約束,可以通過INSTEAD OF 觸發器刪除約束表的數據。