您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

CREATE TRIGGER

Name

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

Synopsis

CREATE TRIGGER 

name

 { BEFORE | AFTER } { 

event

 [OR ...] }
    ON 

table

 FOR EACH { ROW | STATEMENT }
    EXECUTE PROCEDURE 

func

 ( 

arguments

 )
  

输入

name

赋予新触发器的名称.

table

现有表名称.

event

INSERT,DELETE 或 UPDATE 之一.

func

一个用户提供的函数.

输出

CREATE

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

描述

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

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

SELECT 并不更改任何行,因此你不能创建 SELECT 触发器.这种场合下规则和视图更合适些.

请参考 PostgreSQL 程序员手册 中SPI 和触发器章节获取更多信息.

注意

CREATE TRIGGER PostgreSQL 语言扩展.

只有表所有者可以就此表创建一个触发器.

在当前的版本,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  
);