zoukankan      html  css  js  c++  java
  • PostgreSQL触发器的使用

    原文: https://www.yiibai.com/postgresql/postgresql-trigger.html

     

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

    PostgreSQL触发器是一组动作或数据库回调函数,它们在指定的表上执行指定的数据库事件(即,INSERTUPDATEDELETETRUNCATE语句)时自动运行。 触发器用于验证输入数据,执行业务规则,保持审计跟踪等。

    触发器的重点知识

    1. PostgreSQL在以下情况下执行/调用触发器:在尝试操作之前(在检查约束并尝试INSERTUPDATEDELETE之前)。或者在操作完成后(在检查约束并且INSERTUPDATEDELETE完成后)。或者不是操作(在视图中INSERTUPDATEDELETE的情况下)

    2. 对于操作修改的每一行,都会调用一个标记为FOR EACH ROWS的触发器。 另一方面,标记为FOR EACH STATEMENT的触发器只对任何给定的操作执行一次,而不管它修改多少行。

    3. 您可以为同一事件定义同一类型的多个触发器,但条件是按名称按字母顺序触发。

    4. 当与它们相关联的表被删除时,触发器被自动删除。

    PostgreSQL创建触发器

    CREATE TRIGGER语句用于在PostgreSQL表中创建一个新的触发器。 当表发生特定事件(即INSERTUPDATEDELETE)时,它被激活。

    语法

    CREATE  TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name  
    ON table_name  
    [  
     -- Trigger logic goes here....  
    ];
    
    SQL

    在这里,event_name可以是INSERTUPDATEDELETETRUNCATE数据库操作上提到的表table_name。 您可以选择在表名后指定FOR EACH ROW

    下面来看看看如何在INSERT操作中创建触发器的语法。

    CREATE  TRIGGER trigger_name AFTER INSERT ON column_name  
    ON table_name  
    [  
     -- Trigger logic goes here....  
    ];
    
    SQL

    触发器例子

    下面举个例子来演示PostgreSQL在INSERT语句之后创建触发器。在以下示例中,我们对每个记录插入到COMPANY表中进行审核(审计)。

    使用以下查询创建一个名为COMPANY的表:

    CREATE TABLE COMPANY(  
       ID INT PRIMARY KEY     NOT NULL,  
       NAME           TEXT    NOT NULL,  
       AGE            INT     NOT NULL,  
       ADDRESS        CHAR(50),  
       SALARY         REAL  
    );
    
    SQL

    为了保存审计/审核,我们将创建一个名为AUDIT的新表,只要在COMPANY表中有一个新记录的条目,就会插入日志消息。

    使用以下查询语句创建另一个表Audit

    CREATE TABLE AUDIT(  
        EMP_ID INT NOT NULL,  
        ENTRY_DATE TEXT NOT NULL  
    );
    
    SQL

    COMPANY表上创建触发器之前,首先创建一个名为auditlogfunc()的函数/过程。

    执行以下查询语句来创建函数/过程:

    CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$  
        BEGIN  
            INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);  
            RETURN NEW;   
        END;  
    $example_table$ LANGUAGE plpgsql;
    
    SQL

    执行结果如下所示-

    现在通过使用以下查询语句在COMPANY表上创建一个触发器:

    CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY  
    FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
    
    SQL

    执行结果如下所示-

    COMPANY表中插入一些数据记录,以验证触发器执行情况。

    INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝阳区', 9999);
    INSERT INTO COMPANY VALUES(2, '京东中科', 6, '广州市天河区', 8999);
    
    SQL

    在执行上面两条插入语句后,现我们来看AUDIT表是否有自动插入两条审核记录。

    可以确定的是在插入数据后触发了触发器,PostgreSQL也自动向AUDIT表中创建/插入两个记录。 这些记录是触发的结果,这是因为我们在AFTER INSERT on COMPANY表上创建了这些记录。

    PostgreSQL触发器的使用

    PostgreSQL触发器可用于以下目的:

    • 验证输入数据。
    • 执行业务规则。
    • 为不同文件中新插入的行生成唯一值。
    • 写入其他文件以进行审计跟踪。
    • 从其他文件查询交叉引用目的。
    • 访问系统函数。
    • 将数据复制到不同的文件以实现数据一致性。

    使用触发器的优点

    • 它提高了应用程序的开发速度。 因为数据库存储触发器,所以您不必将触发器操作编码到每个数据库应用程序中。
    • 全局执法业务规则。定义触发器一次,然后将其重用于使用数据库的任何应用程序。
    • 更容易维护 如果业务策略发生变化,则只需更改相应的触发程序,而不是每个应用程序。
    • 提高客户/服务器环境的性能。 所有规则在结果返回之前在服务器中运行
  • 相关阅读:
    WITH HINDSIGHT
    圆桌最后冲刺
    圆桌总结
    圆桌十日冲刺之⑨
    圆桌十日冲刺之八
    圆桌十日冲刺之七
    圆桌十日冲刺之六
    【09NOIP提高组】Hankson 的趣味题(信息学奥赛一本通 1856)(洛谷 1072)
    灯泡(信息学奥赛一本通 1438)
    最大公约数(信息学奥赛一本通 1627)
  • 原文地址:https://www.cnblogs.com/oxspirt/p/8604973.html
Copyright © 2011-2022 走看看