PostgreSQL觸發器是一組動作或資料庫回撥函式,它們在指定的表上執行指定的資料庫事件(即,INSERT
,UPDATE
,DELETE
或TRUNCATE
語句)時自動執行。 觸發器用於驗證輸入資料,執行業務規則,保持審計跟蹤等。
PostgreSQL在以下情況下執行/呼叫觸發器:在嘗試操作之前(在檢查約束並嘗試INSERT
,UPDATE
或DELETE
之前)。或者在操作完成後(在檢查約束並且INSERT
,UPDATE
或DELETE
完成後)。或者不是操作(在檢視中INSERT
,UPDATE
或DELETE
的情況下)
對於操作修改的每一行,都會呼叫一個標記為FOR EACH ROWS
的觸發器。 另一方面,標記為FOR EACH STATEMENT
的觸發器只對任何給定的操作執行一次,而不管它修改多少行。
您可以為同一事件定義同一型別的多個觸發器,但條件是按名稱按字母順序觸發。
CREATE TRIGGER
語句用於在PostgreSQL表中建立一個新的觸發器。 當表發生特定事件(即INSERT
,UPDATE
和DELETE
)時,它被啟用。
語法
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
-- Trigger logic goes here....
];
在這裡,event_name
可以是INSERT
,UPDATE
,DELETE
和TRUNCATE
資料庫操作上提到的表table_name
。 您可以選擇在表名後指定FOR EACH ROW
。
下面來看看看如何在INSERT
操作中建立觸發器的語法。
CREATE TRIGGER trigger_name AFTER INSERT ON column_name
ON table_name
[
-- Trigger logic goes here....
];
下面舉個例子來演示PostgreSQL在INSERT
語句之後建立觸發器。在以下範例中,我們對每個記錄插入到COMPANY
表中進行稽核(審計)。
使用以下查詢建立一個名為COMPANY
的表:
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
為了儲存審計/稽核,我們將建立一個名為AUDIT
的新表,只要在COMPANY
表中有一個新記錄的條目,就會插入紀錄檔訊息。
使用以下查詢語句建立另一個表Audit
:
CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
在COMPANY
表上建立觸發器之前,首先建立一個名為auditlogfunc()
的函式/過程。
執行以下查詢語句來建立函式/過程:
CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
RETURN NEW;
END;
$example_table$ LANGUAGE plpgsql;
執行結果如下所示-
現在通過使用以下查詢語句在COMPANY
表上建立一個觸發器:
CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
執行結果如下所示-
向COMPANY
表中插入一些資料記錄,以驗證觸發器執行情況。
INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝陽區', 9999);
INSERT INTO COMPANY VALUES(2, '京東中科', 6, '廣州市天河區', 8999);
在執行上面兩條插入語句後,現我們來看AUDIT
表是否有自動插入兩條稽核記錄。
可以確定的是在插入資料後觸發了觸發器,PostgreSQL也自動向AUDIT
表中建立/插入兩個記錄。 這些記錄是觸發的結果,這是因為我們在AFTER INSERT on COMPANY
表上建立了這些記錄。
PostgreSQL觸發器可用於以下目的: