CREATE TRIGGER

名称

CREATE TRIGGER — 创建一个新触发器

语法

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

输入

name
触发器名称.
table
表名称.
event
INSERT,DELETE 或 UPDATE 之一.
funcname
一个用户提供的函数.

输出

CREATE
如果触发器成功创建,返回此信息.

描述

CREATE TRIGGER 将向现有数据库中增加一个新的触发器.触发器将与表 table 相联并且将执行声明的函数 funcname.

触发器可以声明为在对记录进行操作之前(在检查约束之前和 INSERTUPDATEDELETE 执行前)或之后(在检查约束之后和完成了 INSERTUPDATEDELETE 操作)触发.如果触发器在事件之前,触发器可能略过当前记录的操作或改变被插入的(当前)记录(只对 INSERTUPDATE 操作有效).如果触发器在事件之后,所有更改,包括最后的插入,更新或删除对触发器都是"可见"的.

请参考 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  
);