↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4
测试版PostgreSQL 19 Beta 4 尚未正式发布,内容与行为在正式发布前可能变化。正式内容请看当前版本。

9.30. 触发器函数 #

虽然触发器的许多用法都涉及用户编写的触发器函数,但PostgreSQL也提供了一些可直接用于用户定义触发器的内置触发器函数。这些函数汇总于表 9.111中。(另外还有一些内置触发器函数用于实现外键约束和延迟索引约束。由于用户不需要直接使用它们,这里不再说明。)

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

表 9.111. 内置触发器函数

函数

描述

示例用法

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”前缀的原因。)

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游会在正式发布前持续修订。