CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[--触发器逻辑....];
在这里,event_name 可以是在所提到的表 table_name
上的 INSERT、DELETE 和 UPDATE 数据库操作。您可以在表名后选择指定 FOR
EACH ROW。
以下是在 UPDATE 操作上在表的一个或多个指定列上创建触发器的语法:
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[--触发器逻辑....];
实例
让我们假设一个情况,我们要为被插入到新创建的 COMPANY
表(如果已经存在,则删除重新创建)中的每一个记录保持审计试验:
runoobdb=# CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
为了保持审计试验,我们将创建一个名为 AUDIT 的新表。每当
COMPANY 表中有一个新的记录项时,日志消息将被插入其中:
runoobdb=# CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
在这里,ID 是 AUDIT 记录的 ID,EMP_ID 是来自
COMPANY 表的 ID,DATE 将保持 COMPANY 中记录被创建时的时间戳。所以,现在让我们在
COMPANY 表上创建一个触发器,如下所示:
runoobdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
auditlogfunc() 是 PostgreSQL 一个程序,其定义如下:
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 表中插入数据:
runoobdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1,'Paul',32,'California',20000.00);
这时,COMPANY 表中插入了一条记录:
同时, AUDIT 表中也插入了一条记录,因为我们在插入 COMPANY
表时创建了一个触发器。相似的,我们也可以根据需求在更新和删除时创建触发器: