1、什么是触发器
触发器是一种由事件自动触发执行的特殊存储过程,这些事件可以是对一个表进行 INSERT、UPDATE、DELETE 等操作。
触发器经常用于加强数据的完整性约束和业务规则上的约束等。
2、创建触发器
步骤:
先为触发器建一个执行函数,此函数的返回类型为触发器类型 trigger;
然后即可创建相应的触发器。
创建触发器的语法:
CREATE [ CONSTRAINT ] TRIGGER name
{ BEFORE | AFTER | INSTEAD OF } { event [ OR ... ]}
ON table_name
[ FROM referenced_table_name ]
{ NOT DEFERRABLE | [ DEFEREABLE ] { IINITIALLY IMMEDIATE | INITIALLY DEFERED} }
FOR [ EACH ] { ROW | STATEMENT }
[ WHEN { condition }]
EXECUTE PROCEDURE function_name ( arguments )
语法说明:
CREATE --创建触发器 后面为自定义的触发器名称
BEFORE | AFTER --可以选 BEFORE 或 AFTER ,指触发器在附着表操作的之前还是之后触发
INSERT OR DELETE --触发事件,可以在 INSERT | DELETE | UPDATE(OF column ...) 中单选或多选,多选只能用OR连 接,不能用ADD
ON table_name --哪张表改变时会触发触发器
ON DESIGNATED_POINT --附着表,或视图,触发器只能附着在一张表/视图上
FOR EACH ROW --FOR EACH ROW选项说明触发器为行触发器。还有可以有语句触发器,二者区别是触发次数以行 为单位还是语句为单位
3、示例
例如当删除学生表(student)中的一条记录时,把这个学生在成绩表 (score) 中的成绩记录也删除掉,这时就可以使用触发器。
先建触发器的执行函数:
CREATE OR REPLEASE FUNCTION student_delete_trigger_fun()
returns trigger as $$
begin
delete from score where student_no = old.student_no;
return old;
end;
$$
language plpgsql;
再创建这个触发器:
CREATE TRIGGER delete_student_trigger
after delete on student
for each row execute procedure student_delete_trigger_fun();
实现:当你删除这个学生的记录时,改学生关联在成绩表的数据也被删除。
4、语句级和行级触发器
PostgreSQL中的触发器可以分为:语句级触发器与行级触发器。
语句级触发器:
CREATE TRIGGER log_trigger
AFTER INSERT OR DELETE OR UPDATE ON student
FOR STATEMENT EXECUTE PROCEDURE student_log_trigger();
语句级触发器执行每个SQL时,只执行一次 。
行级触发器:
CREATE TRIGGER log_trigger
AFTER INSERT OR DELETE OR UPDATE ON student
FOR EACH ROW EXECUTE PROCEDURE student_log_trigger();
行级触发器每行都会执行一次。
而当SQL语句没有更新实际的行时,语句触发器也会被触发,而行级触发器不会被触发。
5、其他相关
禁用或启用触发器,可用以下命令:ALTER TRIGGER trigger_name DISABLE/ENABLE;
禁用某个表上的所有触发器,可用如下命令:ALTER TABLE table_name DISABLE ALL TRIGGERS.