PostgreSQL触发器是一组动作或数据库回调函数,它们在指定的表上执行指定的数据库事件(即,INSERT
,UPDATE
,DELETE
或TRUNCATE
语句)时自动运行。 触发器用于验证输入数据,执行业务规则,保持审计跟踪等。
触发器的重点知识
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....
];
SQL
在这里,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....
];
SQL
触发器例子
下面举个例子来演示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
);
SQL
为了保存审计/审核,我们将创建一个名为AUDIT
的新表,只要在COMPANY
表中有一个新记录的条目,就会插入日志消息。
使用以下查询语句创建另一个表Audit
:
CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
SQL
在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;
SQL
执行结果如下所示-
现在通过使用以下查询语句在COMPANY
表上创建一个触发器:
CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
SQL
执行结果如下所示-
向COMPANY
表中插入一些数据记录,以验证触发器执行情况。
INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝阳区', 9999);
INSERT INTO COMPANY VALUES(2, '京东中科', 6, '广州市天河区', 8999);
SQL
在执行上面两条插入语句后,现我们来看AUDIT
表是否有自动插入两条审核记录。
可以确定的是在插入数据后触发了触发器,PostgreSQL也自动向AUDIT
表中创建/插入两个记录。 这些记录是触发的结果,这是因为我们在AFTER INSERT on COMPANY
表上创建了这些记录。
PostgreSQL触发器的使用
PostgreSQL触发器可用于以下目的:
- 验证输入数据。
- 执行业务规则。
- 为不同文件中新插入的行生成唯一值。
- 写入其他文件以进行审计跟踪。
- 从其他文件查询交叉引用目的。
- 访问系统函数。
- 将数据复制到不同的文件以实现数据一致性。
使用触发器的优点
- 它提高了应用程序的开发速度。 因为数据库存储触发器,所以您不必将触发器操作编码到每个数据库应用程序中。
- 全局执法业务规则。定义触发器一次,然后将其重用于使用数据库的任何应用程序。
- 更容易维护 如果业务策略发生变化,则只需更改相应的触发程序,而不是每个应用程序。
- 提高客户/服务器环境的性能。 所有规则在结果返回之前在服务器中运行。