PostgreSQL
上一頁   下一頁

CREATE TRIGGER

名稱

CREATE TRIGGER ─ 創建一個新觸發器

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

輸入

name
觸發器名稱。
table
表名稱。
event
INSERT,DELETE 或 UPDATE 之一。
funcname
一個用戶提供的函數。

輸出

CREATE
如果觸發器成功創建,返回此資訊。

描述

CREATE TRIGGER 將向現有資料庫中增加一個新的觸發器。觸發器將與表 table 相聯並且將執行聲明的函數 funcname。

觸發器可以聲明為在對記錄進行操作之前(在檢查約束之前和 INSERTUPDATEDELETE 執行前)或之後(在檢查約束之後和完成了 INSERTUPDATEDELETE 操作)觸發。如果觸發器在事件之前,觸發器可能略過當前記錄的操作或改變被插入的(當前)記錄(只對 INSERTUPDATE 操作有效)。如果觸發器在事件之後,所有更改,包括最後的插入,更新或刪除對觸發器都是"可見"的。

請參考 PostgreSQL 程式員手冊 中SPI 和觸發器章節獲取更多資訊。

注意

CREATE TRIGGER 是一個 Postgres 語言擴展。

只有表所有者可以就此表創建一個觸發器。

在當前的版本(v6.5),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  
);
    

不過,外部鍵字(foreign keys)在目前的 Postgres 裡還沒有實現(版本 6.5)。(譯注:在版本7.0裡已經實現了外部鍵字。)


上一頁 首頁 下一頁
CREATE TABLE AS 開頭 CREATE TYPE