一、觸發器概述
- 觸發器是一種由事件自動觸發執行的特殊存儲過程,這些事件可以是對一個表進行 INSERT、UPDATE、DELETE 等操作
- 觸發器經常用於加強數據的完整性約束和業務規則上的約束等
二、創建觸發器的步驟
- 先為觸發器建一個執行函數,函數的返回類型為觸發器類型trigger,然后即可創建相應的觸發器
- 例如當刪除學生表(student)中的一條記錄時,把這個學生在成績表 (score) 中的成績記錄也刪除掉,這時就可以使用觸發器
三、觸發器函數
create function sentence_insert() returns trigger as $$ BEGIN IF (new.id > 4000) THEN insert into tbl_sentence_log(content) values (session_user); return new; ELSEIF (new.id < 4000) THEN RAISE EXCEPTION 'command % is disabled', now(); END IF; END $$ language plpgsql;
四、創建觸發器
1)觸發器語法
CREATE [OR REPLACE] TRIGGER TRIGGER_NAME {BEFORE | AFTER} TRIGGER_EVENT ON TABLE_NAME [FOR EACH ROW] [WHEN TRIGGER_CONDITION] TRIGGER_BODY 語法解釋: TRIGGER_NAME 觸發器名稱 BEFORE | AFTER 指定觸發器是在觸發事件發生之前觸發或者發生之后觸發 TRIGGER_EVENT 觸發事件,在DML觸發器中主要為INSERT、UPDATE、DELETE等 TABLE_NAME 表名,表示發生觸發器作用的對象 FOR EACH ROW 指定創建的是行級觸發器,若沒有該子句則創建的是語句級觸發器 WHEN TRIGGER_CONDITION 添加的觸發條件 TRIGGER_BODY 觸發體,是標准的PL/SQL語句塊
2)創建觸發器示例
CREATE TRIGGER INSERT_TRIGGER AFTER INSERT ON TBL_SENTENCE FOR EACH ROW EXECUTE PROCEDURE SENTENCE_INSERT();
五、語句級觸發器與行級觸發器
- 語句級的觸發器是指執行每個 SQL 時,只執行一次,行級觸發器則指每行都會執行一次。
- 一個修改零行的操作會導致合適的語句級觸發器被執行,但不會觸發行級觸發器。
- 批量插入時,語句級別的觸發器只觸發一次,不管 affected row 是否為 0,但是行級觸發器的觸發次數為 affected row。
六、BEFORE 觸發器與 AFTER 觸發器
- 語句級別的 BEFORE 觸發器是在語句開始做任何事情之前就被觸發了,而語句級別的 AFTER 觸發器是在語句結束時才觸發的。
- 行級別的 BEFORE 觸發器在對特定行進行操作之前觸發,而行級別的 AFTER 觸發器是在語句結束時才觸發的,但是它會在任何語句級別的 AFTER 觸發器被觸發之前觸發。
七、觸發器函數中的特殊變量
當把一個 PL/pgSQL 函數當作觸發器函數調用的時候,系統會在頂層的聲明段里自動創建幾個特殊變量, 比如在之前例子中的 “NEW”、“OLD”、“TG_OP” 變量等。可以使用的變量有如下這些。
NEW:該變量為 INSERT/UPDATE 操作觸發的行級觸發器中存儲的新的數據行,數據類型是 RECORD。 在語句級別的觸發器里此變量沒有分配,DELETE 操作觸發的行級觸發器中此變量也沒有分配。
OLD:該變量為 UPDATE/DELETE 操作觸發的行級觸發器中存儲的舊數據行,數據類型是 RECORD。 在語句級別的觸發器里此變量沒有分配, INSERT 操作觸發的行級觸發器中此變量也沒有分配。
TG_NAME:數據類型是 name,該變量包含實際觸發的觸發器名。
TG_WHEN: 內容為 BEFORE 或 AFTER 的字符串,用於指定是 BEFORE 觸發器還是 AFTER 觸發器。
TG_LEVEL: 內容為 ROW 或 STATEMENT 的字符串用於指定是語句級觸發器還是行級觸發器。
TG_OP: 內容為 INSERT、UPDATE、DELETE、TRUNCATE 之一的字符串,用於指定 DML 語句的類型。
TG_RELID: 觸發器所在表的 OID。
TG_TABLE_NAME: 觸發器所在表的名稱。
TG_TABLE_SCHEMA: 觸發器所在表的模式。
TG_NARGS: 在 CREATE TRIGGER 語句里面賦予觸發器過程的參數個數。
TG_ARGV[]: 為 text 類型的一個數組;是 CREATE TRIGGER 語句里的參數。
八、刪除觸發器函數
DROP FUNCTION sentence_insert()
九、刪除觸發器
DROP TRIGGER IF EXISTS 觸發器名稱 ON 表名稱;