9.28. 触发器函数 #
虽然触发器的许多用法都涉及用户编写的触发器函数,但 PostgreSQL 也提供了一些可直接用于用户定义触发器的内置触发器函数。这些函数汇总于表 9.99 中。(另外还有一些内置触发器函数用于实现外键约束和延迟索引约束。由于用户不需要直接使用它们,这里不再说明。)
有关创建触发器的更多信息,请参考 CREATE TRIGGER。
表 9.99. 内置触发器函数
函数 描述 示例用法 |
|---|
抑制不改变数据的更新操作。详见下文。
|
根据关联的纯文本文档列自动更新
|
根据关联的纯文本文档列自动更新
|
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”前缀的原因。)
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.