Provided by:
manpages-zh_1.5-1_all 
NAME
CREATE TRIGGER - 定義一虓s的觸發器
SYNOPSIS
CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE funcname ( arguments )
DESCRIPTIONyz
CREATE TRIGGER 創建一虓s的觸發器。
觸發器將與指定表關聯並且將在特定事件發生時執行聲明的函數 func。
觸發器可以聲明為在對記錄進行操作之前(在檢查約束之前和 INSERT,UPDATE
或 DELETE 執行前)或操作完成之後(在檢查約束之後和完成 INSERT, UPDATE
或 DELETE 操作)觸發。
如果觸發器在事件之前,觸發器可能略過當前記錄的操作或改變被插入的(當前)記錄(只對
INSERT 和 UPDATE 操作有效)。
如果觸發器在事件之後,所有更改,包括最後的插入,
更新或刪除對觸發器都是"可見"的。
一 FOR EACH ROW 執行指定操作的觸發器為操作-
蚹麊漕C一行都調用一次。比如,一蚍v響 10 行的 DELETE 將導-
P任何在目標關系上的 ON DELETE 觸發器獨立調用 10 次, 每-
茬Q刪除的行一次。相比之下,一茯鬥定操作 FOR EACH STATEMENT
的觸發器只是為任何操作執行一次,不管有多少行被蚹鵅C (特別是,一-
蚹儮s行的操作仍然會導P任何合適的 FOR EACH STATEMENT 觸發器的執行。)
如果多茼P類型的觸發器為同樣事件做了定義, 那麼它-
戔N按照字母順序被激活。
SELECT 並不更改任何行,因此你不能創建 SELECT
觸發器。這種場合下規則和視圖更合適些。
請參考 Part V ``Triggers'' 獲取更多信息。
PARAMETERS數
name 賦予新觸發器的名稱。它必需和任何作用於同一表的觸發器不同。
BEFORE
AFTER 決定該函數是在事件之前還是之後調用。
event INSERT,DELETE 或 UPDATE 其中之一。 它聲明擊發觸發器的事件。多-
茖韞i以用 OR 聲明。
table 觸發器作用的表名稱(可以用模式袡╮^。
FOR EACH ROW
FOR EACH STATEMENT
這些選項聲明觸發器過程是否為觸發器事件影響的每茼磑眶o一次,
還是只為每條 SQL 語句觸發一次。如果都沒有聲明, FOR EACH
STATEMENT 是預設。
func 一茖洏峈抴ㄗ悛漕蝻A它聲明為不接受參數並且返回 trigger 類型。
arguments
一茈i選的用逗號分隔的參數列表,它將在觸發器執行的時-
埭ㄗ捄麂蝻A
這些參數是文本字串常量。也可以在這裏寫簡單的名字和數-
`量,但是它抪|被轉換成字串。
請檢查實現語言中關於如何在觸發器函數中訪問觸發器參數的描z;
這些參數可能和普通的函數參數不同。
NOTES`N
n在一茠矰W創建一蚅眶o器,使用者必需在該表上有 TRIGGER 權。
在 PostgreSQL 版本 7.3 以前, 我怚眸概熗眶o器函數聲明為返回佔位類型
opaque, 而不是 trigger。為了支持裝載老的轉儲檔案, CREATE TRIGGER
將接受一蚆n明為返回 opaque 的函數, 但是它將發出一條 NOTICE
並且把函數聲明的返回類型改成 trigger。
用 DROP TRIGGER [drop_trigger(7)] 獲取如何刪除觸發器的信息。
EXAMPLESl
Section 33.4 ``Triggers'' 包含一荍嗾膋漕狺l。
COMPATIBILITYe性
CREATE TRIGGER 裏的 CREATE TRIGGER 語句實現了一 SQL99 標準的子集。
(SQL92 裏沒有觸發器) 目前仍然缺少下悸漸\能︰
o SQL99 允許觸發器為指定的字段的更新進行觸發(也就是說,AFTER UPDATE OF
col1, col2)。
o SQL99 允許你為 "old" 和 "new"
行或者表定義別名,用於定義觸發器的動作(也就是說, CREATE TRIGGER ...
ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername
...)。因為 PostgreSQL
允許觸發器過程以任意數量的使用者定義語言進行書寫,所以訪問數據的工作是用和語言相關的方法實現的。
o PostgreSQL 只允許為觸發的動作執行存儲的過程。SQL99 允許執行一些其他的
SQL 命令, 比如那 CREATE TABLE 作為觸發器動作。 這茪謒瓣讕順},只-
n創建一荌鶡瘜o些命令的存儲過程即可。
SQL99 n求多蚅眶o器應該以創建的時間順序執行。 PostgreSQL
採用的是按照名字順序, 我抳{為這樣更加方便。
用 OR 給一蚅眶o器聲明多荌囮@是 PostgreSQL 對標準的擴展。
SEE ALSO見
CREATE FUNCTION [create_function(7)], ALTER TRIGGER [alter_trigger(l)],
DROP TRIGGER [drop_trigger(l)]
者
Postgresql <laser@pgsqldb.org>