1、什麼是觸發器
觸發器是一種由事件自動觸發執行的特殊存儲過程,這些事件可以是對一個表進行 INSERT、UPDATE、DELETE 等操作。
觸發器經常用于加強資料的完整性限制和業務規則上的限制等。
2、建立觸發器
步驟:
先為觸發器建一個執行函數,此函數的傳回類型為觸發器類型 trigger;
然後即可建立相應的觸發器。
建立觸發器的文法:
CREATE [ CONSTRAINT ] TRIGGER name
{ BEFORE | AFTER | INSTEAD OF } { event [ OR ... ]}
ON table_name
[ FROM referenced_table_name ]
{ NOT DEFERRABLE | [ DEFEREABLE ] { IINITIALLY IMMEDIATE | INITIALLY DEFERED} }
FOR [ EACH ] { ROW | STATEMENT }
[ WHEN { condition }]
EXECUTE PROCEDURE function_name ( arguments )
文法說明:
CREATE --建立觸發器 後面為自定義的觸發器名稱
BEFORE | AFTER --可以選 BEFORE 或 AFTER ,指觸發器在附着表操作的之前還是之後觸發
INSERT OR DELETE --觸發事件,可以在 INSERT | DELETE | UPDATE(OF column ...) 中單選或多選,多選隻能用OR連 接,不能用ADD
ON table_name --哪張表改變時會觸發觸發器
ON DESIGNATED_POINT --附着表,或視圖,觸發器隻能附着在一張表/視圖上
FOR EACH ROW --FOR EACH ROW選項說明觸發器為行觸發器。還有可以有語句觸發器,二者差別是觸發次數以行 為機關還是語句為機關
3、示例
例如當删除學生表(student)中的一條記錄時,把這個學生在成績表 (score) 中的成績記錄也删除掉,這時就可以使用觸發器。
先建觸發器的執行函數:
CREATE OR REPLEASE FUNCTION student_delete_trigger_fun()
returns trigger as $$
begin
delete from score where student_no = old.student_no;
return old;
end;
$$
language plpgsql;
再建立這個觸發器:
CREATE TRIGGER delete_student_trigger
after delete on student
for each row execute procedure student_delete_trigger_fun();
實作:當你删除這個學生的記錄時,改學生關聯在成績表的資料也被删除。
4、語句級和行級觸發器
PostgreSQL中的觸發器可以分為:語句級觸發器與行級觸發器。
語句級觸發器:
CREATE TRIGGER log_trigger
AFTER INSERT OR DELETE OR UPDATE ON student
FOR STATEMENT EXECUTE PROCEDURE student_log_trigger();
語句級觸發器執行每個SQL時,隻執行一次 。
行級觸發器:
CREATE TRIGGER log_trigger
AFTER INSERT OR DELETE OR UPDATE ON student
FOR EACH ROW EXECUTE PROCEDURE student_log_trigger();
行級觸發器每行都會執行一次。
而當SQL語句沒有更新實際的行時,語句觸發器也會被觸發,而行級觸發器不會被觸發。
5、其他相關
禁用或啟用觸發器,可用以下指令:ALTER TRIGGER trigger_name DISABLE/ENABLE;
禁用某個表上的所有觸發器,可用如下指令:ALTER TABLE table_name DISABLE ALL TRIGGERS.