↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 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 7.2 已于 2007 年 2 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CREATE TRIGGER

CREATE TRIGGER — 定义一个新的触发器

大纲

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

Inputs

name

给予新触发器的名称。

table

现有表的名称。

event

INSERT、DELETE 或 UPDATE 之一。

func

一个用户提供的函数。

Outputs

CREATE

触发器创建成功时返回此消息。

描述

CREATE TRIGGER 将把一个新触发器登记到当前数据库中。该触发器将与关系 table 关联,并执行指定的函数 func。

可以指定触发器在操作试图作用于元组之前(BEFORE,即约束检查和 INSERT、UPDATE 或 DELETE 尝试之前)引发,或在操作尝试之后(AFTER,例如约束检查完毕且 INSERT、UPDATE 或 DELETE 已完成之后)引发。如果触发器在事件之前引发,它可以跳过对当前元组的操作,或者修改被插入的元组(仅适用于 INSERT 和 UPDATE 操作)。如果触发器在事件之后引发,那么所有更改(包括最后一次插入、更新或删除)对触发器都是“可见”的。

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

更多信息参见 PostgreSQL 程序员指南 中关于 SPI 和触发器的章节。

Notes

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

截至当前版本,STATEMENT 触发器尚未实现。

关于如何移除触发器,参见 DROP TRIGGER 命令。

示例

在向表 films 追加或更新行之前,检查指定的发行商代码是否存在于 distributors 表中:

CREATE TRIGGER if_dist_exists
    BEFORE INSERT OR UPDATE ON films FOR EACH ROW
    EXECUTE PROCEDURE check_primary_key ('did', 'distributors', 'did');

在取消一个发行商或更新其代码之前,移除对表 films 的所有引用:

CREATE TRIGGER if_film_exists 
    BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW
    EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films', 'did');

第二个例子也可以使用外键约束来完成,如下所示:

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    CONSTRAINT if_film_exists
    FOREIGN KEY(did) REFERENCES films
    ON UPDATE CASCADE ON DELETE CASCADE  
);

兼容性

SQL92

SQL92 中没有 CREATE TRIGGER 语句。

SQL99

PostgreSQL 中的 CREATE TRIGGER 语句实现了 SQL99 标准的一个子集。缺少以下功能:

  • SQL99 允许触发器在对特定列的更新时引发(例如 AFTER UPDATE OF col1, col2)。

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

  • PostgreSQL 只有行级触发器,没有语句级触发器。

  • PostgreSQL 只允许被触发动作执行一个存储过程。SQL99 允许执行若干其他 SQL 命令(例如 CREATE TABLE)作为被触发动作。通过创建一个执行这些命令的存储过程,这一限制不难绕过。

另请参阅

CREATE FUNCTION, DROP TRIGGER , PostgreSQL 程序员指南

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。