• 【转】PostgreSQL触发器(二)语句级触发器与行级触发器


    原文: https://blog.csdn.net/liyazhen2011/article/details/82802342

    在这里,event_name可以是INSERTUPDATEDELETETRUNCATE数据库操作上提到的表//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/postgresql/postgresql-trigger.html

     

    raise函数

    在PostgreSQL中,该函数用于打印字符串,类似于Java中的System.out.println(),Oracle中的dbms_output.put_line()

    用法如下:

    raise notice 'My name is %, I am a %.', 'Lewis', 'coder';
    

    以上sql会在控制台输出My name is Lewis, I am a coder.。如果是在DBeaver里使用该函数,则会在output的tab里输出字符串。

    raise后面的notice是级别,一共有debug/log/info/notice/warning/exception这些级别,可以任意指定一个级别。有些类似于Java里的日志框架,比如Log4j2之类的。

    接着级别后面的是要输出的字符串参数,用一对单引号包括起来。这个字符串支持占位符的写法,也就是%这个字符。如果在字符串里使用了这个%,那么会自动使用字符串参数后面的参数来替换掉这里的%。有多少个占位符,就需要在第一个字符串参数后面加上多少个对应的参数。

    这个占位符输出的用法,也和Log4j2类似。

    raise打印出来的信息可以输出到服务端日志,也可以输出到客户端,亦或者同时输出到二者。这个是由log_min_messagesclient_min_messages两个参数控制的,这两个参数在数据库初始化时用到。

    ------------------------------------------

    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语句没有更新实际的行时,语句触发器也会被触发,而行级触发器不会被触发。

     
    ————————————————
    触发器返回不能指 对应的作用?应用场景如下:

    返回值为null

    • 则不对当前触发的表进行任何操作,比如对table_A 新增数据触发函数,如果函数返回null, 则数据就不会插入到table_A
    • 该场景多应用于分区表的新增操作,把数据新增到分区表中

    返回值为new

    • 执行了触发器函数后还会再次将新增的数据,插入到当前的表 table_A
    • 该场景多应用于数据验证,或者其他的操作逻辑,比如同时往日志表中插入数据
  • 相关阅读:
    Kafka文件存储机制及offset存取
    Kafka基本架构及原理
    Spark性能优化指南——基础篇
    SparkStreaming:关于checkpoint的弊端
    SparkStreaming基本架构及使用
    Spark RDD、DataFrame原理及操作详解
    Spark 广播变量BroadCast
    Spark基本架构及原理
    Spark On Yarn的两种模式yarn-cluster和yarn-client深度剖析
    大数据架构:搭建CDH5.5.1分布式集群环境
  • 原文地址:https://www.cnblogs.com/oxspirt/p/14448535.html
Copyright © 2020-2023  润新知