PostgreSQL觸發(fā)器是一組動(dòng)作或數(shù)據(jù)庫(kù)回調(diào)函數(shù),它們?cè)谥付ǖ谋砩蠄?zhí)行指定的數(shù)據(jù)庫(kù)事件(即,INSERT,UPDATE,DELETE或TRUNCATE語(yǔ)句)時(shí)自動(dòng)運(yùn)行。 觸發(fā)器用于驗(yàn)證輸入數(shù)據(jù),執(zhí)行業(yè)務(wù)規(guī)則,保持審計(jì)跟蹤等。
PostgreSQL在以下情況下執(zhí)行/調(diào)用觸發(fā)器:在嘗試操作之前(在檢查約束并嘗試INSERT,UPDATE或DELETE之前)?;蛘咴诓僮魍瓿珊?在檢查約束并且INSERT,UPDATE或DELETE完成后)?;蛘卟皇遣僮?在視圖中INSERT,UPDATE或DELETE的情況下)
對(duì)于操作修改的每一行,都會(huì)調(diào)用一個(gè)標(biāo)記為FOR EACH ROWS的觸發(fā)器。 另一方面,標(biāo)記為FOR EACH STATEMENT的觸發(fā)器只對(duì)任何給定的操作執(zhí)行一次,而不管它修改多少行。
您可以為同一事件定義同一類型的多個(gè)觸發(fā)器,但條件是按名稱按字母順序觸發(fā)。
CREATE TRIGGER語(yǔ)句用于在PostgreSQL表中創(chuàng)建一個(gè)新的觸發(fā)器。 當(dāng)表發(fā)生特定事件(即INSERT,UPDATE和DELETE)時(shí),它被激活。
語(yǔ)法
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
-- Trigger logic goes here....
];
在這里,event_name可以是INSERT,UPDATE,DELETE和TRUNCATE數(shù)據(jù)庫(kù)操作上提到的表table_name。 您可以選擇在表名后指定FOR EACH ROW。
下面來(lái)看看看如何在INSERT操作中創(chuàng)建觸發(fā)器的語(yǔ)法。
CREATE TRIGGER trigger_name AFTER INSERT ON column_name
ON table_name
[
-- Trigger logic goes here....
];
下面舉個(gè)例子來(lái)演示PostgreSQL在INSERT語(yǔ)句之后創(chuàng)建觸發(fā)器。在以下示例中,我們對(duì)每個(gè)記錄插入到COMPANY表中進(jìn)行審核(審計(jì))。
使用以下查詢創(chuàng)建一個(gè)名為COMPANY的表:
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
為了保存審計(jì)/審核,我們將創(chuàng)建一個(gè)名為AUDIT的新表,只要在COMPANY表中有一個(gè)新記錄的條目,就會(huì)插入日志消息。
使用以下查詢語(yǔ)句創(chuàng)建另一個(gè)表Audit:
CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
在COMPANY表上創(chuàng)建觸發(fā)器之前,首先創(chuàng)建一個(gè)名為auditlogfunc()的函數(shù)/過(guò)程。
執(zhí)行以下查詢語(yǔ)句來(lái)創(chuàng)建函數(shù)/過(guò)程:
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;
執(zhí)行結(jié)果如下所示-

現(xiàn)在通過(guò)使用以下查詢語(yǔ)句在COMPANY表上創(chuàng)建一個(gè)觸發(fā)器:
CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
執(zhí)行結(jié)果如下所示-
向COMPANY表中插入一些數(shù)據(jù)記錄,以驗(yàn)證觸發(fā)器執(zhí)行情況。
INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝陽(yáng)區(qū)', 9999);
INSERT INTO COMPANY VALUES(2, '京東中科', 6, '廣州市天河區(qū)', 8999);
在執(zhí)行上面兩條插入語(yǔ)句后,現(xiàn)我們來(lái)看AUDIT表是否有自動(dòng)插入兩條審核記錄。

可以確定的是在插入數(shù)據(jù)后觸發(fā)了觸發(fā)器,PostgreSQL也自動(dòng)向AUDIT表中創(chuàng)建/插入兩個(gè)記錄。 這些記錄是觸發(fā)的結(jié)果,這是因?yàn)槲覀冊(cè)?code>AFTER INSERT on COMPANY表上創(chuàng)建了這些記錄。
PostgreSQL觸發(fā)器可用于以下目的: