Man page - create_trigger(7)

Manual

CREATE TRIGGER

NAME
SYNOPSIS
DESCRIPTION 描 述
PARAMETERS 引 數
NOTES 注 意
EXAMPLES 例 子
COMPATIBILITY 相 容 性
SEE ALSO 參 見
譯 者


NAME

CREATE TRIGGER - 定 義 一 個 新 的 觸 發 器

SYNOPSIS

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

DESCRIPTION 描 述

CREATE TRIGGER 建 立 一 個 新 的 觸 發 器 。 觸 發 器 將 與 指 定 表 關 聯 並 且 將 在 特 定 事 件 發 生 時 執 行 宣 告 的 函 式 func。

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

一 個 FOR EACH ROW 執 行 指 定 操 作 的 觸 發 器 為 操 作 修 改 的 每 一 行 都 呼 叫 一 次 。 比 如 , 一 個 影 響 10 行 的 DELETE 將 導 致 任 何 在 目 標 關 係 上 的 ON DELETE 觸 發 器 獨 立 呼 叫 10 次 , 每 個 被 刪 除 的 行 一 次 。 相 比 之 下 , 一 個 為 指 定 操 作 FOR EACH STATEMENT 的 觸 發 器 只 是 為 任 何 操 作 執 行 一 次 , 不 管 有 多 少 行 被 修 改 。 ( 特 別 是 , 一 個 修 改 零 行 的 操 作 仍 然 會 導 致 任 何 合 適 的 FOR EACH STATEMENT 觸 發 器 的 執 行 。 )

如 果 多 個 同 類 型 的 觸 發 器 為 同 樣 事 件 做 了 定 義 , 那 麼 它 們 將 按 照 字 母 順 序 被 啟 用 。

SELECT 並 不 更 改 任 何 行 , 因 此 你 不 能 建 立 SELECT 觸 發 器 。 這 種 場 合 下 規 則 和 檢 視 更 合 適 些 。

請 參 考 Part V ‘‘Triggers’’ 獲 取 更 多 資 訊 。

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 許 可 權 。

在 PostgreSQL 版 本 7.3 以 前 , 我 們 必 須 把 觸 發 器 函 式 宣 告 為 返 回 佔 位 型 別 opaque, 而 不 是 trigger。 為 了 支 援 裝 載 老 的 轉 儲 檔 案 , CREATE TRIGGER 將 接 受 一 個 宣 告 為 返 回 opaque 的 函 式 , 但 是 它 將 發 出 一 條 NOTICE 並 且 把 函 式 宣 告 的 返 回 型 別 改 成 trigger。

用 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 對 標 準 的 擴 充 套 件 。

SEE ALSO 參 見

CREATE FUNCTION [ create_function (7)], ALTER TRIGGER [ alter_trigger (l)], DROP TRIGGER [ drop_trigger (l)]

譯 者

Postgresql 中 文 網 站 何 偉 平 <laser@pgsqldb.org>

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。
中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh