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

SYNOPSIS

 

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

DESCRIPTION 描述

CREATE TRIGGER 建立一个新的触发器。 触发器将与指定表关联而且将在特定事件发生时执行声明的函数 func。ide


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


 一个 FOR EACH ROW 执行指定操做的触发器为操做修改的每一行都调用一次。好比,一个影响 10 行的 DELETE 将致使任何在目标关系上的 ON DELETE 触发器独立调用 10 次, 每一个被删除的行一次。相比之下,一个为指定操做 FOR EACH STATEMENT  的触发器只是为任何操做执行一次,无论有多少行被修改。 (特别是,一个修改零行的操做仍然会致使任何合适的 FOR EACH STATEMENT 触发器的执行。)事件


 若是多个同类型的触发器为一样事件作了定义, 那么它们将按照字母顺序被激活。it

SELECT 并不更改任何行,所以你不能建立 SELECT 触发器。这种场合下规则和视图更合适些。io


 请参考 Part V ``Triggers'' 获取更多信息。event

PARAMETERS 参数

name

 赋予新触发器的名称。它必需和任何做用于同一表的触发器不一样。
BEFORE
AFTER

 决定该函数是在事件以前仍是以后调用。
event
INSERT,DELETE 或 UPDATE 其中之一。 它声明击发触发器的事件。多个事件能够用 OR 声明。
table
触发器做用的表名称(能够用模式修饰)。
FOR EACH ROW
FOR EACH STATEMENT

 这些选项声明触发器过程是否为触发器事件影响的每一个行触发一次, 仍是只为每条 SQL 语句触发一次。若是都没有声明, FOR EACH STATEMENT 是缺省。
func
一个用户提供的函数,它声明为不接受参数而且返回 trigger 类型。
arguments

 一个可选的用逗号分隔的参数列表,它将在触发器执行的时候提供给函数, 这些参数是文本字串常量。也能够在这里写简单的名字和数值常量,可是它们会被转换成字串。 请检查实现语言中关于如何在触发器函数中访问触发器参数的描述; 这些参数可能和普通的函数参数不一样。

NOTES 注意


 要在一个表上建立一个触发器,用户必需在该表上有 TRIGGER 权限。table


 在 PostgreSQL 版本 7.3 之前, 咱们必须把触发器函数声明为返回占位类型 opaque, 而不是 trigger。为了支持装载老的转储文件, CREATE TRIGGER 将接受一个声明为返回 opaque 的函数, 可是它将发出一条 NOTICE 而且把函数声明的返回类型改为 trigger。class


 用 DROP TRIGGER [drop_trigger(7)] 获取如何删除触发器的信息。兼容性

EXAMPLES 例子

Section 33.4 ``Triggers'' 包含一个完整的例子。扩展

COMPATIBILITY 兼容性

CREATE TRIGGER 里的 CREATE TRIGGER 语句实现了一个 SQL99 标准的子集。 (SQL92 里没有触发器) 目前仍然缺乏下面的功能∶

*
SQL99 容许触发器为指定的字段的更新进行触发(也就是说,AFTER UPDATE OF col1, col2)。
*
SQL99 容许你为 "old" 和 "new" 行或者表定义别名,用于定义触发器的动做(也就是说, CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...)。由于 PostgreSQL 容许触发器过程以任意数量的用户定义语言进行书写,因此访问数据的工做是用和语言相关的方法实现的。
*
PostgreSQL 只容许为触发的动做执行存储的过程。SQL99 容许执行一些其余的 SQL 命令, 好比那 CREATE TABLE 做为触发器动做。 这个限止并不难绕开,只要建立一个执行这些命令的存储过程便可。

 

SQL99 要求多个触发器应该以建立的时间顺序执行。 PostgreSQL 采用的是按照名字顺序, 咱们认为这样更加方便。

 用 OR 给一个触发器声明多个动做是 PostgreSQL  对标准的扩展。