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触发器可用于以下目的: