扫码一下
查看教程更方便
postgresql 触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。
下面是关于 postgresql 触发器几个比较重要的点:
创建触发器时的基础语法如下:
create trigger trigger_name [before|after|instead of] event_name
on table_name
[
-- 触发器逻辑....
];
在这里,event_name 可以是在所提到的表 table_name 上的 insert、delete 和 update 数据库操作。您可以在表名后选择指定 for each row。
以下是在 update 操作上在表的一个或多个指定列上创建触发器的语法:
create trigger trigger_name [before|after] update of column_name
on table_name
[
-- 触发器逻辑....
];
让我们假设一个情况,我们要为被插入到新创建的 company 表(如果已经存在,则删除重新创建)中的每一个记录保持审计试验:
jiyik_db=# create table company(
id int primary key not null,
name text not null,
age int not null,
address char(50),
salary real
);
为了保持审计试验,我们将创建一个名为 audit 的新表。每当 company 表中有一个新的记录项时,日志消息将被插入其中:
jiyik_db=# create table audit(
emp_id int not null,
entry_date text not null
);
在这里,id 是 audit 记录的 id,emp_id 是来自 company 表的 id,date 将保持 company 中记录被创建时的时间戳。所以,现在让我们在 company 表上创建一个触发器,如下所示:
jiyik_db=# 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 表中插入数据:
jiyik_db=# insert into company (id,name,age,address,salary) values (1, 'paul', 32, 'california', 20000.00 );
这时,company 表中插入了一条记录:
同时, audit 表中也插入了一条记录,因为我们在插入 company 表时创建了一个触发器。相似的,我们也可以根据需求在更新和删除时创建触发器:
emp_id | entry_date
-------- -------------------------------
1 | 2013-05-05 15:49:59.968 05:30
(1 row)
你可以把从 pg_trigger 表中把当前数据库所有触发器列举出来:
jiyik_db=# select * from pg_trigger;
如果,你想列举出特定表的触发器,语法如下:
jiyik_db=# select tgname from pg_trigger, pg_class where tgrelid=pg_class.oid and relname='company';
结果如下:
tgname
-----------------
example_trigger
(1 row)
删除触发器基础语法如下:
drop trigger ${trigger_name} on ${table_of_trigger_dependent};
删除本文上表 company 上的触发器 example_trigger 的指令为:
drop trigger example_trigger on company;