选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

9.28. 触发器函数 #

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

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

Table 9.97. 内置触发器函数

函数

描述

示例用法

suppress_redundant_updates_trigger ( ) → trigger

阻止不做事的更新操作。详见下文。

CREATE TRIGGER ... suppress_redundant_updates_trigger()

tsvector_update_trigger ( ) → trigger

自动从相关的纯文本文档列更新tsvector列。 要使用的文本搜索配置是以名称指定为触发器参数。详情请参见Section 12.4.3

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

tsvector_update_trigger_column ( ) → trigger

自动从相关的纯文本文档列更新tsvector列。 要使用的文本搜索配置取自表的regconfig列。详情请参见Section 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前缀的原因。)