Postgresql 中文操作指南

9.28. Trigger Functions #

虽然触发器的许多用途都涉及用户编写的触发器函数,但 PostgreSQL 提供了几个可以直接在用户自定义触发器中使用的内置触发器函数。这些函数已在 Table 9.103 中汇总。(存在其他内置触发器函数,它们可实现外来键约束和暂缓索引约束。这里未记录这些函数,因为用户无需直接使用它们。)

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

Table 9.103. Built-In Trigger Functions

Function

Description

Example Usage

suppress_redundant_updates_trigger ( ) → trigger 抑制无操作更新操作。有关详细信息,请参阅下文。 CREATE TRIGGER …​ suppress_redundant_updates_trigger()

tsvector_update_trigger ( ) → trigger 自动从关联的纯文本文档列更新 tsvector 列。要使用的文本搜索配置通过触发器参数指定为名称。有关详细信息,请参阅 Section 12.4.3CREATE TRIGGER …​ tsvector_update_trigger(tsvcol, 'pg_catalog.swedish', title, body)

tsvector_update_trigger_column ( ) → trigger 自动从关联的纯文本文档列更新 tsvector 列。要使用的文本搜索配置采用自表的 regconfig 列。有关详细信息,请参阅 Section 12.4.3CREATE 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”前缀。)