↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 7.1 已结束支持。 请参阅 当前版本手册.

CREATE RULE

CREATE RULE — 定义一条新规则

大纲

CREATE RULE name AS ON event
    TO object [ WHERE condition ]
    DO [ INSTEAD ] action

where action can be:

NOTHING
|
query
|
( query ; query ... )
|
[ query ; query ... ]
  

输入

name

要创建的规则的名称。

event

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

object

Object 是 table 或 table.column。(目前,实际上只实现了 table 形式。)

condition

任意的 SQL 布尔条件表达式。条件表达式不能引用 new 和 old 之外的任何表。

query

组成 action 的一个或多个查询可以是任何 SQL 的 SELECT、INSERT、UPDATE、DELETE 或 NOTIFY 语句。

在 condition 和 action 中,可以使用特殊表名 new 和 old 来引用被引用表(即 object)中的值。new 在 ON INSERT 和 ON UPDATE 规则中有效,用于引用正在被插入或更新的新行。old 在 ON SELECT、ON UPDATE 和 ON DELETE 规则中有效,用于引用正在被选择、更新或删除的现有行。

输出

CREATE

规则成功创建时返回的消息。

描述

Postgres 的规则系统允许定义在对数据库表进行插入、更新或删除时所执行的替代动作。规则也用于实现表视图。

一条规则的语义是:当单个实例(行)被访问、插入、更新或删除时,会有一个旧实例(对于选择、更新和删除)和一个新实例(对于插入和更新)。给定事件类型和给定目标对象(表)的所有规则会被检查,顺序不确定。如果 WHERE 子句中指定的 condition(如果有)为真,该规则的 action 部分就会被执行。如果指定了 INSTEAD,action 会替代原始查询执行;否则,它在原始查询执行之前完成。在 condition 和 action 两部分中,旧实例和/或新实例中字段的值会替换到 old.attribute-name 和 new.attribute-name 上。

规则的 action 部分可以由一个或多个查询组成。要编写多个查询,需用圆括号或方括号包围它们。这些查询会按指定的顺序执行(而对于一个对象上多条规则的执行顺序则没有任何保证)。action 也可以是 NOTHING,表示没有任何动作。因此,一条 DO INSTEAD NOTHING 规则会阻止原始查询的执行(当其条件为真时);而一条 DO NOTHING 规则没有任何用处。

规则的 action 部分与触发激活它的用户命令使用相同的命令标识符和事务标识符执行。

注解

目前,ON SELECT 规则必须是无条件的 INSTEAD 规则,并且其动作必须由单个 SELECT 查询组成。因此,一条 ON SELECT 规则实际上会把对象表变为视图,其可见内容是该规则的 SELECT 查询返回的行,而不是表中原来存储的内容(如果有)。直接编写 CREATE VIEW 命令被认为比创建表并为其定义 ON SELECT 规则的风格更好。

要在一个表上定义规则,你必须拥有该表的规则定义权限。使用 GRANT 和 REVOKE 来更改权限。

避免循环规则非常重要。例如,尽管下面两条规则定义中的每一条都被 Postgres 接受,但 select 命令会导致 Postgres 报告错误,因为查询循环了太多次:

例 1. 循环重写规则组合的例子:

CREATE RULE bad_rule_combination_1 AS
    ON SELECT TO emp
    DO INSTEAD 
	SELECT * FROM toyemp;
     
CREATE RULE bad_rule_combination_2 AS
    ON SELECT TO toyemp
    DO INSTEAD 
	SELECT * FROM emp;
     

这个从 EMP 中选择的尝试会导致 Postgres 报错,因为这些查询循环了太多次:

SELECT * FROM emp;
      


兼容性

SQL92

CREATE RULE 语句是 Postgres 的语言扩展。SQL92 中没有 CREATE RULE 语句。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.