一個觸發器聲明了當執行一種特定類型的操作時數據庫應該自動執行一個特殊的函數。觸發器可以被附加到表、視圖和外部表。觸發器經常用於做完整性約束,或者某種業務規則的約束。
1. 觸發器的創建語法如下:
CREATE [CONSTRAINT] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ...] } ON table_name [ FROM referenced_table_name ] {[ NOT DEFERRABLE ][ DEFERRABLE ]{[ INITIALLY IMMEDIATE ][ INITIALLY DEFERRED]}} [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN (condition) ] EXECUTE PROCEDURE function_name ( arguments )
2. 觸發器的創建步驟如下:
先為觸發器創建一個執行函數,返回類型為觸發器類型,然后創建相應的觸發器。
3. 觸發器的分類如下:
(1)語句級觸發器:一條SQL語句,觸發器只執行一次,即使是修改了零行數據的SQL,也會導致相應的觸發器執行。
(2)行級觸發器:每行發生變化,就會執行一次觸發器。
(3)BEFORE觸發器:在觸發事件之前執行觸發器。
(4)AFTER觸發器:在觸發事件之后執行觸發器。
4. 觸發器中的一些特殊變量如下:
(1)NEW
數據類型是RECORD;該變量為行級觸發器中的INSERT/UPDATE操作保持新數據行。在語句級別的觸發器以及DELETE操作,這個變量未被賦值。
(2)OLD
數據類型是RECORD;該變量為行級觸發器中的UPDATE/DELETE操作保持新數據行。在語句級別的觸發器以及INSERT操作,這個變量未被賦值。
(3)TG_NAME
數據類型是name;該變量包含實際觸發的觸發器名。
(4)TG_WHEN
數據類型是text;是值為BEFORE、AFTER或INSTEAD OF的一個字符串,取決於觸發器的定義。
(5)TG_LEVEL
數據類型是text;是值為ROW或STATEMENT的一個字符串,取決於觸發器的定義。
(6)TG_OP
數據類型是text;是值為INSERT、UPDATE、DELETE或TRUNCATE的一個字符串,它說明觸發器是為哪個操作引發。
(7)TG_RELID
數據類型是oid;是導致觸發器調用的表的對象 ID。
(8)TG_RELNAME
數據類型是name;是導致觸發器調用的表的名稱。現在已經被廢棄,並且可能在未來的一個發行中消失。使用TG_TABLE_NAME替代。
(9)TG_TABLE_NAME
數據類型是name;是導致觸發器調用的表的名稱。
(10)TG_TABLE_SCHEMA
數據類型是name;是導致觸發器調用的表所在的模式名。
(11)TG_NARGS
數據類型是integer;在CREATE TRIGGER語句中給觸發器過程的參數數量。
(12)TG_ARGV[]
數據類型是text數組;來自CREATE TRIGGER語句的參數。索引從 0 開始記數。非法索引(小於 0 或者大於等於tg_nargs)會導致返回一個空值。
The End!
2017-08-17