# 9.28.触发功能

虽然触发器的许多用途都涉及用户编写的触发器函数,但PostgreSQL提供了一些内置的触发器函数,可以直接用于用户定义的触发器。总结如下:表9.99(存在其他内置触发器函数,它们实现外键约束和延迟索引约束。由于用户不需要直接使用它们,因此此处不记录这些约束。)

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

表9.99.内置触发函数

作用

描述

示例用法
抑制冗余更新触发器( ) →触发

抑制不执行任何更新操作。详情见下文。

创建触发器。。。抑制冗余更新触发器()
tsvector_更新_触发器( ) →触发

自动更新tsvector关联纯文本文档列中的列。要使用的文本搜索配置由名称指定为触发器参数。看见第12.4.3节详细信息。

CREATE TRIGGER ... tsvector_update_trigger(tsvcol, 'pg_catalog.swedish', title, body)
tsvector_update_trigger_column( ) →扳机

自动更新一个向量来自关联的纯文本文档列的列。要使用的文本搜索配置取自注册配置表的列。看第 12.4.3 节详情。

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

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

理想情况下,您应该避免运行不会实际更改记录中数据的更新。冗余更新可能会花费大量不必要的时间,特别是如果有很多索引要更改,并且死行中的空间最终必须被清理掉。然而,在客户端代码中检测这种情况并不总是容易的,甚至是不可能的,编写表达式来检测它们可能容易出错。另一种方法是使用抑制冗余更新触发器,这将跳过不更改数据的更新。但是,您应该小心使用它。触发器为每条记录花费一小段时间,因此如果大多数受更新影响的记录确实发生了变化,则使用此触发器将使更新平均运行得更慢。

抑制冗余更新触发器函数可以像这样添加到表中:

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

在大多数情况下,您需要为每一行最后触发此触发器,以便它不会覆盖可能希望更改该行的其他触发器。请记住触发器按名称顺序触发,因此您将选择一个触发器名称,该名称位于您可能在表上的任何其他触发器的名称之后。(因此示例中的“z”前缀。)