觸發器分為兩種,一種與數據表綁定,響應數據表指定動作(insert、delete或update),此處稱為表級;一種與資料庫本身綁定,響應數據定義語句(主要是CREATE、ALTER 和 DROP 開頭的語句),此處稱為庫級。本篇以下所說觸發器皆指表級觸發器。 觸發器是一段有特定語法,實現一定功能的 ...
觸發器分為兩種,一種與數據表綁定,響應數據表指定動作(insert、delete或update),此處稱為表級;一種與資料庫本身綁定,響應數據定義語句(主要是CREATE、ALTER 和 DROP 開頭的語句),此處稱為庫級。本篇以下所說觸發器皆指表級觸發器。
觸發器是一段有特定語法,實現一定功能的SQL語句,它與數據表綁定,當數據表發生指定動作(insert、delete或update)時,由資料庫自動調用。一個觸發器必須且只能綁定一張數據表,必須且只能綁定數據表的一個動作(insert、delete或update)。觸發器可以分為兩種,一種是動作之後(After),一種是替代執行(instead of)。兩種觸發器可以同時綁定數據表的同一個動作(insert、delete或update)。但動作之後(After)觸發器可以同時綁定多個,而替代執行(instead of)觸發器一個數據表只能綁定三個,即一個動作(insert、delete或update)只能綁定一個。
觸發器耗費性能,不易調試,不利於遷移,不符合時興的面向對象設計理念,也不容易被接手老項目的人註意到,因而應儘量避免使用。
觸發器語法:
創建: CREATE TRIGGER trigger_name --觸發器的名字 ON {table_name | view_name} --與觸發器綁定的表或視圖,必須且只能與一個表或視圖綁定 {FOR | After | Instead of } --觸發器類型,動作之後(After)或替代執行(instead of) [ insert, update,delete ] --觸發器響應的具體動作,一個觸發器只能響應一個動作 AS sql_statement --你需要編寫的SQL語句
刪除: DROP TRIGGER { trigger/*要刪除的觸發器名字*/ } [ ,...n ]
修改: ALTER TRIGGER trigger_name --觸發器的名字 ON table_name --與觸發器綁定的表或視圖,必須且只能與一個表或視圖綁定 {FOR | After | Instead of } --觸發器類型,動作之後(After)或替代執行(instead of) {[DELETE][,][INSERT][,][UPDATE]}--觸發器響應具體動作,一個觸發器只能響應一個動作 AS sql_statement; --你需要編寫的SQL語句
禁用啟用觸發器: 禁用:alter table 表名 disable trigger 觸發器名稱 啟用:alter table 表名 enable trigger 觸發器名稱
觸發器執行後會自動創建兩張虛表inserted與deleted。它們可以理解為系統自動創建的、在觸發器中使用的臨時表,觸發器開始時創建,結束後刪除。它們的結構與觸發器綁定的表結構一致,並且是只讀的。
動作 |
Inserted |
Deleted |
增加(insert) |
存放增加的記錄 |
無 |
刪除(delete) |
無 |
存放被刪除的記錄 |
修改(update) |
存放更新後的記錄 |
存放更新前的記錄 |
當數據表只存在動作之後(After)觸發器時,動作(insert、delete或update)對數據表進行真實更改,而存在替代執行(instead of)觸發器時,動作(insert、delete或update)不對數據表進行真實更改。替代執行(instead of)觸發器執行時間先於動作之後(After)觸發器。有多個動作之後(After)觸發器時,執行順序取決於觸發器建立時間,先建立的先執行。
觸發器中不能使用以下語句:
CREATE 語句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。 ALTER 語句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。 DROP 語句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。 DISK 語句,如:DISK INIT、DISK RESIZE。 LOAD 語句,如:LOAD DATABASE、LOAD LOG。 RESTORE 語句,如:RESTORE DATABASE、RESTORE LOG。
=====================================================================================
本文只代表本人的見解,可能存在錯誤,僅用於技術交流。如果你喜歡該文,可以掃下麵的二維碼打賞我(打賞敬請備註“博客園打賞”五字)。