支持的版本:当前 (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.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前缀。)

提交更正

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