PostgreSQL - TRIGGERS

PostgreSQL 触发器是数据库回调函数,它们在发生指定的数据库事件时自动执行/调用.

以下是有关PostgreSQL触发器的重要观点;

  • 可以指定PostgreSQL触发器触发

    • 在一行上尝试操作之前(在检查约束并尝试INSERT,UPDATE或DELETE之前)

    • 操作完成后(检查约束并完成INSERT,UPDATE或DELETE后)

    • 而不是操作(在插入的情况下)视图上的更新或删除)

  • 标记为FOR EACH ROW的触发器被调用一次操作修改的每一行.相反,标记为FOR EACH STATEMENT的触发器仅对任何给定的操作执行一次,无论它修改了多少行.

  • 两者,WHEN子句和触发器操作,可以使用 NEW.column-name OLD.column-name 形式的引用访问正在插入,删除或更新的行的元素,其中列-name是与触发器关联的表中列的名称.

  • 如果提供了WHEN子句,则仅执行指定的PostgreSQL语句对于WHEN子句为true的行.如果没有提供WHEN子句,则对所有行执行PostgreSQL语句.

  • 如果为同一事件定义了多个相同类型的触发器,它们将按名称按字母顺序触发.

  • BEFORE,AFTER或INSTEAD OF关键字确定何时执行相对于插入,修改或删除的触发操作相关行的行.

  • 当与它们关联的表被删除时,触发器会自动删除.

  • 要修改的表必须与附加触发器的表或视图位于同一数据库中,并且必须只使用 tablename ,而不是 database.tablename .

  • 指定时,CONSTRAINT选项会创建约束触发器.除了可以使用SET CONSTRAINTS调整触发器触发的时间之外,这与常规触发器相同.当违反实施约束时,约束触发器会引发异常.

语法

创建触发器的基本语法如下 :

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

此处, event_name 可以是 INSERT,DELETE, 更新, TRUNCATE 对上述表 table_name 的数据库操作.您可以选择在表名后指定FOR EACH ROW.

以下是在表的一个或多个指定列上对UPDATE操作创建触发器的语法,如下所示 :

CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
 -- Trigger logic goes here....
];

示例

让我们考虑一下我们想要为在COMPANY表中插入的每条记录保留审计试用的情况,我们将新创建如下(如果您已经拥有它,请删除COMPANY表).

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

为了保持审计试验,我们将创建一个名为AUDIT的新表,只要在COMPANY表中有一个条目用于新记录,就会插入日志消息. ;

testdb=# CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

这里,ID是AUDIT记录ID,EMP_ID是来自COMPANY表的ID,DATE将保留记录时的时间戳在COMPANY表中创建.现在,让我们在COMPANY表上创建一个触发器,如下所示 :

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

其中auditlogfunc()是PostgreSQL 程序并且具有以下定义 :

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;

现在,我们将开始实际工作.让我们开始在COMPANY表中插入记录,这将导致在AUDIT表中创建审计日志记录.因此,让我们在COMPANY表中创建一条记录,如下所示 :

testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

这将在COMPANY表中创建一条记录,如下所示;

 
 id |名字|年龄|地址|薪水
 ---- + ------ + ----- + -------------- + -------- 
 1 |保罗| 32 |加州| 20000

同时,将在AUDIT表中创建一条记录.此记录是触发器的结果,我们在COMPANY表上的INSERT操作上创建了该触发器.同样,您可以根据您的要求在UPDATE和DELETE操作上创建触发器.

 id | name | age | address      | salary
----+------+-----+--------------+--------
  1 | Paul |  32 | California   |  20000

列出TRIGGERS

您可以从 pg_trigger 表中列出当前数据库中的所有触发器,如下所示 :

testdb=# SELECT * FROM pg_trigger;

上面给出的PostgreSQL语句将列出所有触发器.

如果要列出特定触发器的触发器table,然后使用带有表名的AND子句,如下 :

testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';

上面给出的PostgreSQL语句也将只列出一个条目,如下所示;

     tgname
-----------------
 example_trigger
(1 row)

删除TRIGGERS

以下是DROP命令,可用于删除现有触发器 :

testdb=# DROP TRIGGER trigger_name;