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