PostgreSQL 触发器是数据库回调函数,它们在发生指定的数据库事件时自动执行/调用.
以下是有关PostgreSQL触发器的重要观点;
可以指定PostgreSQL触发器触发
在一行上尝试操作之前(在检查约束并尝试INSERT,UPDATE或DELETE之前)
操作完成后(检查约束并完成INSERT,UPDATE或DELETE后)
而不是操作(在插入的情况下)视图上的更新或删除)
标记为FOR EACH ROW的触发器被调用一次操作修改的每一行.相反,标记为FOR EACH STATEMENT的触发器仅对任何给定的操作执行一次,无论它修改了多少行.
两者,WHEN子句和触发器操作,可以使用 NEW.column-name 和 OLD.column-name 形式的引用访问正在插入,删除或更新的行的元素,其中列-name是与触发器关联的表中列的名称.
如果提供了WHEN子句,则仅执行指定的PostgreSQL语句对于WHEN子句为true的行.如果没有提供WHEN子句,则对所有行执行PostgreSQL语句.
如果为同一事件定义了多个相同类型的触发器,它们将按名称按字母顺序触发.
BEFORE,AFTER或INSTEAD OF关键字确定何时执行相对于插入,修改或删除的触发操作相关行的行.
当与它们关联的表被删除时,触发器会自动删除.
要修改的表必须与附加触发器的表或视图位于同一数据库中,并且必须只使用 tablename ,而不是 database.tablename .
指定时,CONSTRAINT选项会创建约束触发器.除了可以使用SET CONSTRAINTS调整触发器触发的时间之外,这与常规触发器相同.当违反实施约束时,约束触发器会引发异常.
创建触发器的基本语法如下 :
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name ON table_name [ -- Trigger logic goes here.... ];
此处, event_name 可以是 INSERT,DELETE, 更新,和 TRUNCATE 对上述表 table_name 的数据库操作.您可以选择在表名后指定FOR EACH ROW.
以下是在表的一个或多个指定列上对UPDATE操作创建触发器的语法,如下所示 :
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name ON table_name [ -- Trigger logic goes here.... ];
让我们考虑一下我们想要为在COMPANY表中插入的每条记录保留审计试用的情况,我们将新创建如下(如果您已经拥有它,请删除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是来自COMPANY表的ID,DATE将保留记录时的时间戳在COMPANY表中创建.现在,让我们在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 |名字|年龄|地址|薪水 ---- + ------ + ----- + -------------- + -------- 1 |保罗| 32 |加州| 20000
同时,将在AUDIT表中创建一条记录.此记录是触发器的结果,我们在COMPANY表上的INSERT操作上创建了该触发器.同样,您可以根据您的要求在UPDATE和DELETE操作上创建触发器.
id | name | age | address | salary ----+------+-----+--------------+-------- 1 | Paul | 32 | California | 20000
您可以从 pg_trigger 表中列出当前数据库中的所有触发器,如下所示 :
testdb=# SELECT * FROM pg_trigger;
上面给出的PostgreSQL语句将列出所有触发器.
如果要列出特定触发器的触发器table,然后使用带有表名的AND子句,如下 :
testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';
上面给出的PostgreSQL语句也将只列出一个条目,如下所示;
tgname ----------------- example_trigger (1 row)
以下是DROP命令,可用于删除现有触发器 :
testdb=# DROP TRIGGER trigger_name;