PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

37.1. 触发器行为概述 #

触发器是一种数据库声明规范:当对特定数据表或视图执行某种指定类型的操作时,系统会自动隐式调用关联绑定的触发器函数。触发器支持挂载在常规物理表(包括分区表)、视图以及外部表上。

在数据表和外部表上,触发器可以被配置为在 INSERT、UPDATE、DELETE 或 TRUNCATE 操作之前(BEFORE)或之后(AFTER)触发执行。对于行级触发器,每修改一行数据触发一次;对于语句级触发器,整条 SQL 语句仅触发一次。对于视图,则支持定义 INSTEAD OF(替代)触发器,用于拦截对视图的写入并将其转化为对底层基表的真实写操作。

创建触发器前必须首先创建好对应的触发器函数。触发器函数必须声明为不带任何显式入参,且返回值类型固定为特殊的伪类型 trigger。触发器函数在执行时,通过系统隐式注入的上下文变量(在 PL/pgSQL 中表现为 NEW 代表新行、OLD 代表旧行、TG_OP 代表操作类型)获取数据。

函数创建就绪后,通过 CREATE TRIGGER 命令将触发器绑定到目标表上:

CREATE TRIGGER check_user_balance
BEFORE INSERT OR UPDATE ON accounts
FOR EACH ROW
EXECUTE FUNCTION validate_account_balance();

触发器支持通过 WHEN 子句附加前置布尔过滤条件,只有令条件求值为真的行才会真正唤醒触发器函数,极大降低了无谓的函数调用开销。

此外,语句级 AFTER 触发器支持通过 REFERENCING NEW TABLE AS ... OLD TABLE AS ... 引入过渡表(Transition Tables),允许在语句执行完成后,将本次操作批量变更的全量新旧数据行作为一个只读的命名瞬时表在触发器内部进行集中聚合比对或审计转储。