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 创建新触发器。