Man page - create_rule(7)

Manual

CREATE RULE

NAME
SYNOPSIS
DESCRIPTION 描 述
PARAMETERS 引 數
NOTES 注 意
COMPATIBILITY 相 容 性
譯 者


NAME

CREATE RULE - 定 義 一 個 新 的 重 寫 規 則

SYNOPSIS

CREATE [ OR REPLACE ] RULE name AS ON event
TO table [ WHERE condition ]
DO [ INSTEAD ] { NOTHING | command | ( command ; command ... ) }

DESCRIPTION 描 述

CREATE RULE 定 義 一 個 適 用 於 特 定 表 或 者 檢 視 的 新 規 則 。 CREATE OR REPLACE RULE 要 麼 是 建 立 一 個 新 規 則 , 要 麼 是 用 一 個 同 表 上 的 同 名 規 則 替 換 現 有 規 則 。

PostgreSQL規 則 系 統 允 許 我 們 在 從 資 料 庫 或 表 中 更 新 , 插 入 或 刪 除 東 西 時 定 義 一 個 其 它 的 動 作 來 執 行 。 簡 單 說 , 規 則 就 是 當 我 們 在 指 定 的 表 上 執 行 指 定 的 動 作 的 時 候 , 導 致 一 些 額 外 的 動 作 被 執 行 。 另 外 , 規 則 可 以 用 另 外 一 個 命 令 取 代 某 個 特 定 的 命 令 , 或 者 令 命 令 完 全 不 被 執 行 。 規 則 還 用 於 實 現 表 檢 視 。 我 們 要 明 白 的 是 規 則 實 際 上 只 是 一 個 命 令 轉 換 機 制 , 或 者 說 命 令 宏 。 這 種 轉 換 髮 生 在 命 令 開 始 執 行 之 前 。 如 果 你 實 際 上 想 要 一 個 為 每 個 物 理 行 獨 立 發 生 的 操 作 , 那 麼 你 可 能 還 是 要 用 一 個 觸 發 器 , 而 不 是 規 則 。 有 關 規 則 的 更 多 資 訊 可 以 在 ‘‘The Rule System’’ 找 到 。

目 前 , ON SELECT 規 則 必 須 是 無 條 件 的 INSTEAD 規 則 並 且 必 須 有 一 個 由 一 條 SELECT 查 詢 組 成 的 動 作 。 因 此 , 一 條 ON SELECT 規 則 有 效 地 把 物 件 錶 轉 成 檢 視 , 它 的 可 見 內 容 是 規 則 的 SELECT 查 詢 返 回 的 記 錄 而 不 是 儲 存 在 表 中 的 內 容 ( 如 果 有 的 話 ) 。 我 們 認 為 寫 一 條 CREATE VIEW 命 令 比 建 立 一 個 表 然 後 定 義 一 條 ON SELECT 規 則 在 上 面 的 風 格 要 好 。

你 可 以 建 立 一 個 可 以 更 新 的 檢 視 的 幻 覺 , 方 法 是 在 檢 視 上 定 義 ON INSERT, ON UPDATE, 和 ON DELETE 規 則 ( 或 者 滿 足 你 需 要 的 任 何 上 述 規 則 的 子 集 ) , 用 合 適 的 對 其 它 表 的 更 新 替 換 在 檢 視 上 更 新 的 動 作 。

如 果 你 想 在 檢 視 更 新 上 使 用 條 件 規 則 , 那 麼 這 裡 就 有 一 個 補 充 : 對 你 希 望 在 檢 視 上 允 許 的 每 個 動 作 , 你 都 必 須 有 一 個 無 條 件 的 INSTEAD 規 則 。 如 果 規 則 是 有 條 件 的 , 或 者 它 不 是 INSTEAD, 那 麼 系 統 仍 將 拒 絕 執 行 更 新 動 作 的 企 圖 , 因 為 它 認 為 它 最 終 會 在 某 種 程 度 上 在 虛 擬 表 上 執 行 動 作 。 如 果 你 想 處 理 條 件 規 則 上 的 所 由 有 用 的 情 況 , 那 也 可 以 ; 只 需 要 增 加 一 個 無 條 件 的 DO INSTEAD NOTHING 規 則 確 保 系 統 明 白 它 將 決 不 會 被 呼 叫 來 更 新 虛 擬 表 就 可 以 了 。 然 後 把 條 件 規 則 做 成 非 INSTEAD; 在 這 種 情 況 下 , 如 果 它 們 被 觸 發 , 那 麼 它 們 就 增 加 到 預 設 的 INSTEAD NOTHING 動 作 中 。

PARAMETERS 引 數

name

建 立 的 規 則 名 。 它 必 須 在 同 一 個 表 上 的 所 有 規 則 的 名 字 中 唯 一 。 同 一 個 表 上 的 同 一 個 事 件 型 別 的 規 則 是 按 照 字 母 順 序 執 行 的 。

event

事 件 是 SELECT, UPDATE, DELETE 或 INSERT 之 一 。

table

規 則 施 用 的 表 或 者 檢 視 的 名 字 ( 可 以 有 模 式 修 飾 ) 。

condition

任 意 SQL 條 件 表 示 式 ( 返 回 boolean) 。 條 件 表 示 式 除 了 引 用 NEW 和 OLD 之 外 不 能 引 用 任 何 表 , 並 且 不 能 有 聚 集 函 式 。

command

組 成 規 則 動 作 的 命 令 。 有 效 的 命 令 是 SELECT, INSERT, UPDATE, DELETE, 或 NOTIFY 語 句 之 一 。

在 condition 和 command 裡 , 特 殊 表 名 字 NEW 和 OLD 可 以 用 於 指 向 被 引 用 表 裡 的 數 值 new 在 ON INSERT 和 ON UPDATE 規 則 裡 可 以 指 向 被 插 入 或 更 新 的 新 行 。 OLD 在 ON UPDATE, 和 ON DELETE 規 則 裡 可 以 指 向 現 存 的 被 更 新 , 或 者 刪 除 的 行 。

NOTES 注 意

為 了 在 表 上 定 義 規 則 , 你 必 須 有 RULE 許 可 權 。

有 一 件 很 重 要 的 事 情 是 要 避 免 迴 圈 規 則 。 比 如 , 儘 管 下 面 兩 條 規 則 定 義 都 是 PostgreSQL 可 以 接 受 的 , 但 一 條 SELECT 命 令 會 導 致 PostgreSQL 報 告 一 條 錯 誤 資 訊 , 因 為 該 查 詢 迴 圈 了 太 多 次 :

CREATE RULE "_RETURN" AS
ON SELECT TO t1
DO INSTEAD

SELECT * FROM t2;

CREATE RULE "_RETURN" AS
ON SELECT TO t2
DO INSTEAD

SELECT * FROM t1;

SELECT * FROM t1;

目 前 , 如 果 一 個 規 則 包 含 一 個 NOTIFY 查 詢 , 那 麼 該 NOTIFY 將 被 無 條 件 執 行 --- 也 就 是 說 , 如 果 規 則 不 施 加 到 任 何 行 上 頭 , 該 NOTIFY 也 會 被 髮 出 。 比 如 , 在

CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;

UPDATE mytable SET name = ’foo’ WHERE id = 42;

裡 , 一 個 NOTIFY 事 件 將 在 UPDATE 的 時 候 發 出 , 不 管 是 否 有 某 行 的 id = 42。 這 是 一 個 實 現 的 限 制 , 將 來 的 版 本 應 該 修 補 這 個 毛 病 。

COMPATIBILITY 相 容 性

CREATE RULE 是 PostgreSQL 語 言 的 擴 充 套 件 , 整 個 規 則 系 統 也 是 如 此 。

譯 者

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

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