postgresql触发器是一组动作或数据库回调函数,它们在指定的表上执行指定的数据库事件(即,insert
,update
,delete
或truncate
语句)时自动运行。 触发器用于验证输入数据,执行业务规则,保持审计跟踪等。
postgresql在以下情况下执行/调用触发器:在尝试操作之前(在检查约束并尝试insert
,update
或delete
之前)。或者在操作完成后(在检查约束并且insert
,update
或delete
完成后)。或者不是操作(在视图中insert
,update
或delete
的情况下)
对于操作修改的每一行,都会调用一个标记为for each rows
的触发器。 另一方面,标记为for each statement
的触发器只对任何给定的操作执行一次,而不管它修改多少行。
您可以为同一事件定义同一类型的多个触发器,但条件是按名称按字母顺序触发。
create trigger
语句用于在postgresql表中创建一个新的触发器。 当表发生特定事件(即insert
,update
和delete
)时,它被激活。
语法
create trigger trigger_name [before|after|instead of] event_name
on table_name
[
-- trigger logic goes here....
];
在这里,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....
];
下面举个例子来演示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
);
为了保存审计/审核,我们将创建一个名为audit
的新表,只要在company
表中有一个新记录的条目,就会插入日志消息。
使用以下查询语句创建另一个表audit
:
create table audit(
emp_id int not null,
entry_date text not null
);
在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;
执行结果如下所示-
现在通过使用以下查询语句在company
表上创建一个触发器:
create trigger example_trigger after insert on company
for each row execute procedure auditlogfunc();
执行结果如下所示-
向company
表中插入一些数据记录,以验证触发器执行情况。
insert into company values(1, '小米科技', 8, '北京市朝阳区', 9999);
insert into company values(2, '京东中科', 6, '广州市天河区', 8999);
在执行上面两条插入语句后,现我们来看audit
表是否有自动插入两条审核记录。
可以确定的是在插入数据后触发了触发器,postgresql也自动向audit
表中创建/插入两个记录。 这些记录是触发的结果,这是因为我们在after insert on company
表上创建了这些记录。
postgresql触发器可用于以下目的: