2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4

9.29. 触发器函数 #

虽然许多触发器用法涉及用户编写的触发器函数,但 PostgreSQL 提供了一些内置触发器函数,这些函数可以直接在用户定义的触发器中使用。这些函数总结在 表 9.110 中。(还存在其他内置触发器函数,它们实现了外键约束和延迟索引约束。这些不在此处文档化,因为用户不需要直接使用它们。)

有关创建触发器的更多信息,请参阅 CREATE TRIGGER

表 9.110. 内置触发器函数

函数

描述

用法示例

suppress_redundant_updates_trigger ( ) → trigger

抑制无操作的更新操作。详情见下文。

CREATE TRIGGER ... suppress_redundant_updates_trigger()

tsvector_update_trigger ( ) → trigger

从关联的纯文本文档列自动更新 tsvector 列。使用的文本搜索配置由其名称作为触发器参数指定。详情请参阅 第 12.4.3 节

CREATE TRIGGER ... tsvector_update_trigger(tsvcol, 'pg_catalog.swedish', title, body)

tsvector_update_trigger_column ( ) → trigger

从关联的纯文本文档列自动更新 tsvector 列。使用的文本搜索配置从表的一个 regconfig 列获取。详情请参阅 第 12.4.3 节

CREATE TRIGGER ... tsvector_update_trigger_column(tsvcol, tsconfigcol, title, body)


suppress_redundant_updates_trigger 函数,当作为行级 BEFORE UPDATE 触发器应用时,将阻止任何实际上未更改行中数据的更新的发生。这会覆盖正常行为,即正常行为始终执行物理行更新,而不管数据是否已更改。(这种正常行为使更新运行更快,因为不需要检查,并且在某些情况下也很有用。)

理想情况下,您应该避免运行实际上并未更改记录中数据的更新。冗余更新可能耗费大量不必要的时间,特别是当有大量索引需要更改时,并且会产生死行空间,最终需要进行清理。但是,在客户端代码中检测这种情况并不总是容易,甚至不可能,并且编写表达式来检测它们可能容易出错。另一种方法是使用 suppress_redundant_updates_trigger,它会跳过不更改数据的更新。但是,您应该谨慎使用它。该触发器对每条记录都需要花费少量但非微不足道的时间,因此如果受更新影响的大部分记录确实发生了更改,使用此触发器将平均使更新运行速度变慢。

可以使用以下方式将 suppress_redundant_updates_trigger 函数添加到表中

CREATE TRIGGER z_min_update
BEFORE UPDATE ON tablename
FOR EACH ROW EXECUTE FUNCTION suppress_redundant_updates_trigger();

在大多数情况下,您需要为每行最后触发此触发器,以便它不会覆盖其他可能希望修改行的触发器。考虑到触发器按名称顺序触发,因此您应该选择一个触发器名称,该名称应排在您可能在表上设置的任何其他触发器名称之后。(因此,示例中的 z 前缀。)

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的经验不符的内容或需要进一步澄清的内容,请使用 此表格 报告文档问题。