↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 8.0 已结束支持。 请参阅 当前版本手册.

CREATE TRIGGER

CREATE TRIGGER — 定义一个触发器

大纲

CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
    ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
    EXECUTE PROCEDURE funcname ( arguments )

描述

CREATE TRIGGER创建一个新触发器。触发器会关联到指定的表、视图或外部表,并在发生某些事件时执行指定的函数funcname。

可以指定触发器在尝试对某一行执行该操作之前引发(即在检查约束以及尝试执行INSERT、UPDATE或DELETE之前);也可以在该操作完成之后引发(即在检查约束以及完成 INSERT、UPDATE或 DELETE之后);或者取代该操作执行(用于视图上的插入、更新或删除)。如果触发器在事件之前引发,或者改为取代该事件执行,则它可以跳过对当前行的操作,或者修改待插入的行(仅适用于INSERT和UPDATE操作)。如果触发器在事件之后引发,则所有更改(包括其他触发器的影响)对该触发器都是“可见”的。

被标记为FOR EACH ROW的触发器会针对该操作修改的每一行调用一次。例如,一个影响 10 行的DELETE会导致目标关系上的 ON DELETE触发器分别被调用 10 次,即每个被删除的行调用一次。相比之下,被标记为FOR EACH STATEMENT的触发器对于任意给定操作只执行一次,不管该操作修改了多少行(特别是,修改零行的操作仍会导致所有适用的 FOR EACH STATEMENT触发器执行)。

如果针对同一事件定义了多个同类触发器,它们将按名称的字母顺序引发。

SELECT 不会修改任何行,因此无法创建 SELECT 触发器。对于这类情形,规则和视图更为合适。

参见第 32 章以了解有关触发器的更多信息。

参数

name

要赋予新触发器的名称。它必须不同于同一表上任何其他触发器的名称。

BEFORE
AFTER

决定该函数是在事件之前还是之后被调用。

event

INSERT、UPDATE或DELETE之一;它指定将引发该触发器的事件。可以使用OR指定多个事件。

table

该触发器所作用的表、视图或外部表的名称(可以是模式限定的)。

FOR EACH ROW
FOR EACH STATEMENT

这指定触发器过程是针对受触发事件影响的每一行引发一次,还是针对每条 SQL 语句只引发一次。如果两者都未指定,则默认为FOR EACH STATEMENT。

funcname

一个由用户提供的函数,声明为不接受参数并返回 trigger 类型;当触发器被触发时,就会执行该函数。

arguments

一个可选的、以逗号分隔的参数列表,在执行触发器时会传给该函数。这些参数是字符串字面常量。这里也可以写简单名称和数字常量,但它们都会被转换成字符串。请查阅该触发器函数所用实现语言的说明,以了解如何在函数内部访问这些参数;这可能与普通函数参数不同。

注解

要在表上创建触发器,用户必须拥有该表的TRIGGER权限。

使用DROP TRIGGER删除触发器。

在PostgreSQL 7.3 之前的版本中,必须将触发器函数声明为返回占位类型opaque,而不是trigger。为了支持加载旧转储文件,CREATE TRIGGER将接受声明为返回opaque的函数,但会发出通知,并将该函数声明的返回类型更改为trigger。

示例

第 32.4 节包含一个完整示例。

兼容性

PostgreSQL 中的 CREATE TRIGGER 语句实现了 SQL:1999 标准的一个子集。(SQL-92 中没有关于触发器的规定。)以下功能目前尚缺少:

  • SQL:1999 允许触发器在特定列被更新时引发(例如 AFTER UPDATE OF col1, col2)。

  • SQL:1999 允许为在触发动作定义中使用的“旧”行或“新”行定义别名(例如 CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...)。由于 PostgreSQL 允许用任意多种用户定义的语言编写触发器过程,对数据的访问是以语言相关的方式处理的。

  • PostgreSQL 只允许通过执行用户定义函数来完成触发动作。标准则允许把许多其他 SQL 命令(例如 CREATE TABLE)作为触发动作执行。通过创建一个执行所需命令的用户定义函数,这一限制并不难绕过。

SQL 规定多个触发器应按创建时间顺序引发。PostgreSQL 则按名称顺序引发,这被认为更方便。

使用 OR 为单个触发器指定多个动作的能力,是 PostgreSQL 对 SQL 标准的扩展。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.