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

9.29. 触发函数 #

虽然触发器的许多用途都涉及用户编写的触发函数,但 PostgreSQL 提供了一些内置的触发函数,可以直接在用户定义的触发器中使用。这些函数在 表 9.107 中进行了总结。 (还存在其他内置的触发函数,它们实现外键约束和延迟索引约束。这些函数在这里没有记录,因为用户不需要直接使用它们。)

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

表 9.107. 内置触发函数

函数

描述

示例用法

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”。)

提交更正

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