CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] } ON table [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE PROCEDURE funcname ( arguments )
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
要在一个表上建立一个触发器,用户必需在该表上有 TRIGGER 权限。table
在 PostgreSQL 版本 7.3 之前, 咱们必须把触发器函数声明为返回占位类型 opaque, 而不是 trigger。为了支持装载老的转储文件, CREATE TRIGGER 将接受一个声明为返回 opaque 的函数, 可是它将发出一条 NOTICE 而且把函数声明的返回类型改为 trigger。class
用 DROP TRIGGER [drop_trigger(7)] 获取如何删除触发器的信息。兼容性
Section 33.4 ``Triggers'' 包含一个完整的例子。扩展
CREATE TRIGGER 里的 CREATE TRIGGER 语句实现了一个 SQL99 标准的子集。 (SQL92 里没有触发器) 目前仍然缺乏下面的功能∶
SQL99 要求多个触发器应该以建立的时间顺序执行。 PostgreSQL 采用的是按照名字顺序, 咱们认为这样更加方便。
用 OR 给一个触发器声明多个动做是 PostgreSQL 对标准的扩展。