PostgreSQL 觸發器是資料庫的回調函數,它會在指定的資料庫事件發生時自動執行/調用。
下面是關于 PostgreSQL 觸發器幾個比較重要的點:
PostgreSQL 觸發器可以在下面幾種情況下觸發:
在執行操作之前(在檢查限制并嘗試插入、更新或删除之前)。
在執行操作之後(在檢查限制并插入、更新或删除完成之後)。
更新操作(在對一個視圖進行插入、更新、删除時)。
觸發器的 FOR EACH ROW 屬性是可選的,如果選中,當操作修改時每行調用一次;相反,選中 FOR EACH STATEMENT,不管修改了多少行,每個語句标記的觸發器執行一次。
WHEN 子句和觸發器操作在引用 NEW.column-name 和 OLD.column-name 表單插入、删除或更新時可以通路每一行元素。其中 column-name 是與觸發器關聯的表中的列的名稱。
如果存在 WHEN 子句,PostgreSQL 語句隻會執行 WHEN 子句成立的那一行,如果沒有 WHEN 子句,PostgreSQL 語句會在每一行執行。
BEFORE 或 AFTER 關鍵字決定何時執行觸發器動作,決定是在關聯行的插入、修改或删除之前或者之後執行觸發器動作。
要修改的表必須存在于同一資料庫中,作為觸發器被附加的表或視圖,且必須隻使用 tablename,而不是 database.tablename。
當建立限制觸發器時會指定限制選項。這與正常觸發器相同,隻是可以使用這種限制來調整觸發器觸發的時間。當限制觸發器實作的限制被違反時,它将抛出異常。
建立觸發器時的基礎文法如下:
在這裡,event_name 可以是在所提到的表 table_name 上的 INSERT、DELETE 和 UPDATE 資料庫操作。您可以在表名後選擇指定 FOR EACH ROW。
以下是在 UPDATE 操作上在表的一個或多個指定列上建立觸發器的文法:
讓我們假設一個情況,我們要為被插入到新建立的 COMPANY 表(如果已經存在,則删除重新建立)中的每一個記錄保持審計試驗:
為了保持審計試驗,我們将建立一個名為 AUDIT 的新表。每當 COMPANY 表中有一個新的記錄項時,日志消息将被插入其中:
在這裡,ID 是 AUDIT 記錄的 ID,EMP_ID 是來自 COMPANY 表的 ID,DATE 将保持 COMPANY 中記錄被建立時的時間戳。是以,現在讓我們在 COMPANY 表上建立一個觸發器,如下所示:
auditlogfunc() 是 PostgreSQL 一個程式,其定義如下:
現在,我們開始往 COMPANY 表中插入資料:
這時,COMPANY 表中插入了一條記錄:
同時, AUDIT 表中也插入了一條記錄,因為我們在插入 COMPANY 表時建立了一個觸發器。相似的,我們也可以根據需求在更新和删除時建立觸發器:
你可以把從 pg_trigger 表中把目前資料庫所有觸發器列舉出來:
如果,你想列舉出特定表的觸發器,文法如下:
得到結果如下:
删除觸發器基礎文法如下:
删除本文上表 company 上的觸發器 example_trigger 的指令為: