pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
CREATE TRIGGER — 创建一个新的触发器
CREATE TRIGGERname{ BEFORE | AFTER } {event[OR ...] } ONtableFOR EACH { ROW | STATEMENT } EXECUTE PROCEDUREER">funcBLE> (arguments)
name现有触发器的名称。
table表的名称。
eventINSERT、DELETE 或 UPDATE 之一。
funcname一个用户提供的函数。
CREATE触发器创建成功时返回此消息。
CREATE TRIGGER 将把一个新触发器登记到当前数据库中。该触发器将与关系 relname 关联,并执行指定的函数 funcname。
可以指定触发器在操作试图作用于元组之前(即约束检查和 INSERT、UPDATE 或 DELETE 尝试之前)引发,或在操作尝试之后(例如约束检查完毕且 INSERT、UPDATE 或 DELETE 已完成之后)引发。如果触发器在事件之前引发,它可以跳过对当前元组的操作,或者修改被插入的元组(仅适用于 INSERT 和 UPDATE 操作)。如果触发器在事件之后引发,那么所有更改(包括最后一次插入、更新或删除)对触发器都是"可见"的。
更多信息参见 PostgreSQL 程序员指南 中关于 SPI 和触发器的章节。
CREATE TRIGGER 是一种 Postgres 语言扩展。
只有关系的所有者才能在该关系上创建触发器。
截至当前版本(v6.4),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 中没有 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
);
不过,截至 6.4 版本, Postgres 尚未实现外键。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。