PostgreSQL触发器(二)语句级触发器与行级触发器

    PostgreSQL中的触发器可以分为:语句级触发器与行级触发器。

    先说结论:语句级触发器执行每个SQL时,只执行一次 ;行级触发器每行都会执行一次。

    下文会通过实例分别介绍这两种触发器。创建一张学生表和日志表,在日志表中记录对学生表的操作(插入、删除、更新)。

1.建表

CREATE TABLE student (
  id   int primary key,
  name varchar(40)
);

CREATE TABLE student_log (
    op_time timestamp,
    db_user  varchar(40),
    op_type  varchar(20)
);

2.创建执行函数

CREATE OR REPLACE FUNCTION student_log_trigger()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO student_log VALUES(now(), user, TG_OP);
    RETURN NULL;
END;
$$
LANGUAGE plpgsql;

3.语句级触发器

CREATE TRIGGER log_trigger 
    AFTER INSERT OR DELETE OR UPDATE ON student
    FOR STATEMENT EXECUTE PROCEDURE student_log_trigger();

   现在向学生表中插入数据。

INSERT INTO student VALUES(1,'April'),(2,'Harris');

   查看日志表中的信息。

select * from student_log;

   执行结果:

  

  我们发现,在语句级触发器下,虽然学生表中插入了两条数据,但是日志表中只有一条记录。

  结论:语句级触发器执行每个SQL时,只执行一次 

4.行级触发器。

CREATE TRIGGER log_trigger 
     AFTER INSERT OR DELETE OR UPDATE ON student
    FOR EACH ROW EXECUTE PROCEDURE student_log_trigger();

   将学生表上的语句级触发器删除,并且清空学生表。然后创建一个行级触发器,同样执行上述数据插入操作,查看日志表中的信息。

  执行结果:

    我们发现,在行级触发器下,学生表中插入了两条数据,日志表中有两条记录。  

    结论:行级触发器每行都会执行一次。

5.总结

    语句级触发器执行每个SQL时,只执行一次 。它是按照语句进行触发的,而不管这条语句实际操作了多少行数据。

   行级触发器每行都会执行一次。它是按照语句实际操作了多少行数据决定触发的次数。

    当SQL语句没有更新实际的行时,语句触发器也会被触发,而行级触发器不会被触发。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值