建立觸發器
建立觸發器的一般文法是:
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
其中:
BEFORE 和AFTER指出觸發器的觸發時序分別為前觸發和後觸發方式,前觸發是在執行觸發事件之前觸發當前所建立的觸發器,後觸發是在執行觸發事件之後觸發當前所建立的觸發器。
FOR EACH ROW選項說明觸發器為行觸發器。行觸發器和語句觸發器的區別表現在:行觸發器要求當一個DML語句操走影響資料庫中的多行資料時,對於其中的每個資料行,只要它們符合觸發約束條件,均啟用一次觸發器;而語句觸發器將整個語句操作作為觸發事件,當它符合約束條件時,啟用一次觸發器。當省略FOR EACH ROW 選項時,BEFORE 和AFTER 觸發器為語句觸發器,而INSTEAD OF 觸發器則只能為行觸發器。
REFERENCING 子句說明相關名稱,在行觸發器的PL/SQL塊和WHEN 子句中可以使用相關名稱參照當前的新、舊列值,預設的相關名稱分別為OLD和NEW。觸發器的PL/SQL塊中應用相關名稱時,必須在它們之前加冒號(:),但在WHEN子句中則不能加冒號。
WHEN 子句說明觸發約束條件。Condition 為一個邏輯表達時,其中必須包含相關名稱,而不能包含查詢語句,也不能調用PL/SQL 函數。WHEN 子句指定的觸發約束條件只能用在BEFORE 和AFTER 行觸發器中,不能用在INSTEAD OF 行觸發器和其它類型的觸發器中。
當一個基表被修改( INSERT, UPDATE, DELETE)時要執行的預存程序,執行時根據其所依附的基表改動而自動觸發,因此與應用程式無關,用資料庫觸發器可以保證資料的一致性和完整性。
每張表最多可建立12 種類型的觸發器,它們是:
BEFORE INSERT
BEFORE INSERT FOR EACH ROW
AFTER INSERT
AFTER INSERT FOR EACH ROW
BEFORE UPDATE
BEFORE UPDATE FOR EACH ROW
AFTER UPDATE
AFTER UPDATE FOR EACH ROW
BEFORE DELETE
BEFORE DELETE FOR EACH ROW
AFTER DELETE
AFTER DELETE FOR EACH ROW
1 觸發器觸發次序
1. 執行 BEFORE語句級觸發器;
2. 對與受語句影響的每一行:
l 執行 BEFORE行級觸發器
l 執行 DML語句
l 執行 AFTER行級觸發器
3. 執行 AFTER語句級觸發器
2 建立DML觸發器
觸發器名與過程名和包的名字不一樣,它是單獨的名字空間,因而觸發器名可以和表或過程有相同的名字,但在一個模式中觸發器名不能相同。
DML觸發器的限制
l CREATE TRIGGER語句文本的字元長度不能超過32KB;
l 觸發器體內的SELECT 語句只能為SELECT … INTO …結構,或者為定義遊標所使用的SELECT 語句。
l 觸發器中不能使用資料庫事務控制語句 COMMIT; ROLLBACK, SVAEPOINT 語句;
l 由觸發器所調用的過程或函數也不能使用資料庫事務控制語句;
l 觸發器中不能使用LONG, LONG RAW 類型;
l 觸發器內可以參照LOB 類型列的列值,但不能通過 :NEW 修改LOB列中的資料;
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/