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

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 7.1 已结束支持。 请参阅 当前版本手册.

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 操作)。如果触发器在事件之后引发,那么所有更改(包括最后一次插入、更新或删除)对触发器都是"可见"的。

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

注意

CREATE TRIGGER 是一种 Postgres 语言扩展。

只有关系的所有者才能在该关系上创建触发器。

截至当前版本(v7.0),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');
   

兼容性

SQL92

SQL92 中没有 CREATE TRIGGER。

上面的第二个例子也可以使用外键(FOREIGN KEY)约束来完成,如下所示:

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

报告文档问题

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