创建触发器:
要创建一个触发器,你需要:
(1)、使用 create function 语句创建一个触发器函数
(2)、使用 create trigger 语句将触发器函数绑定到数据表
(3)、创建触发器函数语法:
触发器函数与普通函数类似,不同之处在于触发器不需要任何参数,并且触发器函数需要返回trigger类型值
create function trigger_function()
returns trigger as $$
begin
sqlstatement;
return new;
end;$$
language plpgsql;
触发器函数通过一个称为 TriggerData 的特殊结构接收关于其调用环境的数据,其中包含一组局部变量。
如:old 和 new 表示触发事件之前或之后表中的行的状态。PostgreSQL 提供了其他以 TG_ 作为前缀的局部变量:TG_WHEN,
TG_TABLE_NAME 等。
(4)、创建触发器语法(如下简单语法):
create trigger trigger_name
{before | after | instead of} event1 or event2...
on table_name
{for each row | for each statement}
execute procedure trigger_function;
event1: 事件可以是:insert, update, delete, truncate
before: 表示定义触发器在事件之前
after: 表示定义触发器在事件之后
intead of: 表示仅用于视图的insert, update, delete
for each row:表示行级触发器
for each statement:表示语级触发器
案例:
create table employee(
id serial primary key,
first_name varchar(50),
last_name varchar(50)
);
create table employee_audits(
id serial primary key,
employee_id integer,
first_name varchar(50),
last_name varchar(50),
change_time timestamp
);
insert into employee(first_name,last_name)values
('Jerry','Tom'),
('Hunk','Bone');
select * from employee;
创建触发器函数:
create or replace function log_last_name_changes()
returns trigger as $$
begin
if new.last_name <> old.last_name then
insert into employee_audits(employee_id,first_name,last_name,change_time)
values
(old.id,old.first_name,old.last_name,now());
end if;
return new;
end; $$
language plpgsql;
创建触发器绑定到表:
create trigger last_name_changes
before update on employee --定义触发器在事件update之前
for each row
execute procedure log_last_name_changes();
select * from employee_audits;
update employee set last_name='Who' where id=2;
select * from employee_audits;
结果:
id employee_id first_name last_name change_time
1 2 Hunk Bone 2020-04-29 22:38:15.890435
管理触发器
删除触发器:
drop trigger [if exists] trigger_name on table_name [cascade | restrict];
[cascade:级联删除触发器;restrict:被引用时禁止删除]
修改触发器:
alter trigger trigger_name on table_name rename to new_name;
禁用触发器:
禁用该表上的一个触发器
alter table table_name disable trigger trigger_name;
禁用该表上的所有触发器
alter table table_name disable trigger all;
【注】:禁用后的触发器仍然存在于数据库中,只是不触发事件而已。