PostgreSQL 创建触发器

在本教程中,您将学习如何使用 PostgreSQL CREATE TRIGGER 语句来创建触发器。

摘要:在本教程中,您将学习如何使用 PostgreSQL CREATE TRIGGER 语句来创建触发器。

要在 PostgreSQL 中创建新触发器,请执行以下步骤:

  • 首先,使用 CREATE FUNCTION 语句创建一个触发器函数。
  • 其次,通过 using CREATE TRIGGER 语句将触发器函数绑定到一个表。

如果您不熟悉创建用户定义的函数,可以先了解 PostgreSQL 的自定义函数。

创建触发函数语法

触发器函数类似于常规的用户定义函数。但是,触发器函数不接受任何参数并且具有类型为 的返回值 trigger 。

下面说明了创建触发器函数的语法:

CREATE FUNCTION trigger_function() 
   RETURNS TRIGGER 
   LANGUAGE PLPGSQL
AS $$
BEGIN
   -- trigger logic
END;
$$

请注意,您可以使用 PostgreSQL 支持的任何语言创建触发器函数。在本教程中,我们将使用 PL/pgSQL。

触发器函数通过称为 TriggerData 的特殊结构接收有关其调用环境的数据,该结构包含一组局部变量。

例如, OLD 与 NEW 之前或在触发事件之后代表所述表中的行的状态。

PostgreSQL 还提供了其他 TG_ 以 TG_WHEN, 和开头的局部变量 TG_TABLE_NAME 。

一旦定义了一个触发功能,您可以将其绑定到一个或多个触发事件,如 INSERT ,UPDATE和 DELETE 。

PostgreSQL CREATE TRIGGER 语句介绍

该 CREATE TRIGGER 语句创建一个新触发器。下面说明了该 CREATE TRIGGER 语句的基本语法:

CREATE TRIGGER trigger_name 
   {BEFORE | AFTER} { event }
   ON table_name
   [FOR [EACH] { ROW | STATEMENT }]
       EXECUTE PROCEDURE trigger_function

在这个语法中:

首先,在 TRIGGER 关键字后指定触发器的名称。

其次,指定导致触发器触发的时间。它可以是 BEFORE 或者 AFTER 一个事件发生。

第三,指定调用触发器的事件。该事件可以是 INSERT , DELETE , UPDATE 或 TRUNCATE 。

第四,在 ON 关键字后指定与触发器关联的表名。

第五,指定触发器的类型,可以是:

  • 由 FOR EACH ROW 子句指定的行级触发器。
  • 由 FOR EACH STATEMENT 子句指定的语句级触发器。

为每一行触发一个行级触发器,而为每个事务触发一个语句级触发器。

假设一个表有 100 行和两个将在 DELETE 事件发生时触发的触发器。

如果 DELETE 语句删除 100 行,行级触发器将触发 100 次,每个删除的行触发一次。另一方面,无论删除多少行,语句级触发器都会被触发一次。

最后,在 EXECUTE PROCEDURE 关键字后指定触发函数的名称。

PostgreSQL CREATE TRIGGER 示例

以下语句创建一个名为 的新表 employees :

DROP TABLE IF EXISTS employees;

CREATE TABLE employees(
   id INT GENERATED ALWAYS AS IDENTITY,
   first_name VARCHAR(40) NOT NULL,
   last_name VARCHAR(40) NOT NULL,
   PRIMARY KEY(id)
);

假设当员工姓名发生更改时,您希望将更改记录在名为 的单独表中 employee_audits :

CREATE TABLE employee_audits (
   id INT GENERATED ALWAYS AS IDENTITY,
   employee_id INT NOT NULL,
   last_name VARCHAR(40) NOT NULL,
   changed_on TIMESTAMP(6) NOT NULL
);

首先,创建一个名为 的新函数 log_last_name_changes :

CREATE OR REPLACE FUNCTION log_last_name_changes()
  RETURNS TRIGGER 
  LANGUAGE PLPGSQL
  AS
$$
BEGIN
    IF NEW.last_name <> OLD.last_name THEN
         INSERT INTO employee_audits(employee_id,last_name,changed_on)
         VALUES(OLD.id,OLD.last_name,now());
    END IF;

    RETURN NEW;
END;
$$

如果 employee_audits 员工的姓氏发生变化,该函数会将旧姓氏插入表中,包括员工 ID、姓氏和更改时间。

该 OLD 代表更新前行,而 NEW 代表新一行将被更新。在 OLD.last_name 更新之前返回姓氏和 NEW.last_name 返回新的姓氏。

其次,将触发器函数绑定到 employees 表。触发器名称是 last_name_changes . 在 last_name 更新列的值之前,会自动调用触发器函数来记录更改。

CREATE TRIGGER last_name_changes
  BEFORE UPDATE
  ON employees
  FOR EACH ROW
  EXECUTE PROCEDURE log_last_name_changes();

第三,在表中插入一些行 employees :

INSERT INTO employees (first_name, last_name)
VALUES ('John', 'Doe');

INSERT INTO employees (first_name, last_name)
VALUES ('Lily', 'Bush');

四、 employees 查表内容:

SELECT * FROM employees;

假设将 Lily Bush 她的姓氏更改为 Lily Brown 。

第五,将 Lily 的姓氏更新为新的姓氏:

UPDATE employees
SET last_name = 'Brown'
WHERE ID = 2;

七、检查姓氏 Lily 是否已更新:

SELECT * FROM employees;

从输出中可以看出,Lily 的姓氏已更新。

八、验证 employee_audits 表内容:

SELECT * FROM employee_audits;

employee_audits 触发器将更改记录在表中。

在本教程中,您学习了如何使用 PostgreSQL CREATE TRIGGER 创建新触发器。