天天看點

pg資料庫建立觸發器

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.