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触发器可用于以下目的:

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

    使用触发器的优点

    • 它提高了应用程序的开发速度。 因为数据库存储触发器,所以您不必将触发器操作编码到每个数据库应用程序中。
    • 全局执法业务规则。定义触发器一次,然后将其重用于使用数据库的任何应用程序。
    • 更容易维护 如果业务策略发生变化,则只需更改相应的触发程序,而不是每个应用程序。
    • 提高客户/服务器环境的性能。 所有规则在结果返回之前在服务器中运行
  • 相关阅读:
    How to build Linux system from kernel to UI layer
    Writing USB driver for Android
    Xposed Framework for Android 8.x Oreo is released (in beta)
    Linux Smartphone Operating Systems You Can Install Today
    Librem 5 Leads New Wave of Open Source Mobile Linux Contenders
    GUADEC: porting GNOME to Android
    Librem 5 – A Security and Privacy Focused Phone
    GNOME and KDE Join Librem 5 Linux Smartphone Party
    Purism计划推出安全开源的Linux Librem 5智能手机
    国产系统之殇:你知道的这些系统都是国外的
  • 原文地址:https://www.cnblogs.com/oxspirt/p/8604973.html
Copyright © 2011-2022 走看看