PostgreSQL觸發器
PostgreSQL觸發器是一組動作或數據庫回調函數,它們在指定的表上執行指定的數據庫事件(即,INSERT
,UPDATE
,DELETE
或TRUNCATE
語句)時自動運行。 觸發器用於驗證輸入數據,執行業務規則,保持審計跟蹤等。
觸發器的重點知識
PostgreSQL在以下情況下執行/調用觸發器:在嘗試操作之前(在檢查約束並嘗試
INSERT
,UPDATE
或DELETE
之前)。或者在操作完成後(在檢查約束並且INSERT
,UPDATE
或DELETE
完成後)。或者不是操作(在視圖中INSERT
,UPDATE
或DELETE
的情況下)對於操作修改的每一行,都會調用一個標記爲
FOR EACH ROWS
的觸發器。 另一方面,標記爲FOR EACH STATEMENT
的觸發器只對任何給定的操作執行一次,而不管它修改多少行。您可以爲同一事件定義同一類型的多個觸發器,但條件是按名稱按字母順序觸發。
當與它們相關聯的表被刪除時,觸發器被自動刪除。
PostgreSQL創建觸發器
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觸發器的使用
PostgreSQL觸發器可用於以下目的:
- 驗證輸入數據。
- 執行業務規則。
- 爲不同文件中新插入的行生成唯一值。
- 寫入其他文件以進行審計跟蹤。
- 從其他文件查詢交叉引用目的。
- 訪問系統函數。
- 將數據複製到不同的文件以實現數據一致性。
使用觸發器的優點
- 它提高了應用程序的開發速度。 因爲數據庫存儲觸發器,所以您不必將觸發器操作編碼到每個數據庫應用程序中。
- 全局執法業務規則。定義觸發器一次,然後將其重用於使用數據庫的任何應用程序。
- 更容易維護 如果業務策略發生變化,則只需更改相應的觸發程序,而不是每個應用程序。
- 提高客戶/服務器環境的性能。 所有規則在結果返回之前在服務器中運行。