Skip to content

9.28. 触发器函数#

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

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

表 9.103 内置触发器函数

函数

说明

示例用法

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