PostgreSQL 触发器是数据库回调函数,当发生指定的数据库事件时,它们会自动执行。
Triggers - 语法
创建 trigger 的基本语法如下-
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name ON table_name [ -- Trigger logic goes here.... ];
在这里, event_name 可以是上述表上的 INSERT,DELETE, UPDATE,和 TRUNCATE 数据库操作table_name 。您可以选择在表名称后指定FOR EACH ROW。
以下是在表的一个或多个指定列上的UPDATE操作上创建触发器的语法,如下所示-
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name ON table_name [ -- Trigger logic goes here.... ];
Triggers - 示例
让无涯教程考虑一种情况,在这种情况下,无涯教程希望对COMPANY表中插入的每条记录进行审计试用,无涯教程将按如下方式重新创建。
testdb=# CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
为了保持审计试用状态,无涯教程将创建一个名为AUDIT的新表,只要在COMPANY表中有新记录的数据,就会插入日志消息-
testdb=# CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL );
在这里,ID是AUDIT记录ID,EMP_ID是ID,它将来自COMPANY表,当在COMPANY表中创建记录时DATE将保留时间戳。现在,让无涯教程在COMPANY表上创建触发器,如下所示:
testdb=# 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表中插入记录,这将导致在AUDIT表中创建审核日志记录,因此,让无涯教程在COMPANY表中创建一条记录,如下所示-
testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );
这将在COMPANY表中创建一条记录,如下所示-
id | name | age | address | salary ----+------+-----+--------------+-------- 1 | Paul | 32 | California | 20000
同时,将在AUDIT表中创建一条记录,该记录是触发器的输出,该触发器是无涯教程在COMPANY表上的INSERT操作上创建的,同样,您可以根据需要在UPDATE和DELETE操作上创建触发器。
emp_id | entry_date --------+------------------------------- 1 | 2013-05-05 15:49:59.968+05:30 (1 row)
Triggers - 列出触发器
您可以从 pg_trigger 表中列出当前数据库中的所有触发器,如下所示-
testdb=# SELECT * FROM pg_trigger;
上面给出的PostgreSQL语句将列出所有触发器。
如果要列出特定表上的触发器,则将AND子句与表名一起使用,如下所示:
testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';
上面给出的PostgreSQL语句还将仅列出以下一项-
tgname ----------------- example_trigger (1 row)
Triggers - 删除触发器
以下是DROP命令,可用于删除现有触发器-
testdb=# DROP TRIGGER trigger_name;
参考链接
https://www.learnfk.com/postgresql/postgresql-triggers.html
标签:触发器,PostgreSQL,name,Triggers,COMPANY,无涯,trigger,表中 From: https://blog.51cto.com/u_14033984/8963883