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.