CREATE RULE

CREATE RULE

定义新的重写规则。

概要

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

描述

CREATE RULE定义了应用于指定表或视图的新规则。 CREATE OR REPLACE RULE将创建一个新规则,或为同一表替换一个具有相同名称的现有规则。

Greenplum数据库规则系统允许您定义对数据库表中的插入,更新或删除执行的另一种操作。 当执行给定表上的给定命令时,规则将导致执行附加或替代命令。 INSTEAD规则可以用另一个命令替换给定命令,或导致根本不执行命令。 规则也可以用于实现SQL视图。 重要的是要认识到规则实际上是命令转换机制或命令宏。 转换发生在命令执行开始之前。 它不会像触发器那样针对每个物理行独立运行。

ON SELECT规则必须是无条件的INSTEAD规则,并且必须具有由单个SELECT命令组成的操作。 因此,ON SELECT规则有效地将表变成视图, 其可见内容是规则的SELECT命令返回的行,而不是表中存储的内容(如果有的话)。 与创建真实表并为其定义ON SELECT规则相比, 写CREATE VIEW命令被认为是更好的样式。

您可以通过定义ON INSERTON UPDATEON DELETE规则将视图上的更新操作替换为其他表上的适当更新, 来创建可更新视图的错觉。 如果要支持INSERT RETURNING等,请确保在每个规则中放入合适的RETURNING子句。

如果尝试使用条件规则进行视图更新,则有一个陷阱: 要允许在视图上执行的每个操作都必须有一个无条件的INSTEAD规则。 如果规则是有条件的,或者不是INSTEAD,则系统仍将拒绝执行更新操作的尝试, 因为它认为在某些情况下可能最终尝试对视图的虚拟表执行操作。 如果要处理条件规则中的所有有用情况,请添加无条件的DO INSTEAD NOTHING规则, 以确保系统理解它将永远不会被调用它来更新虚拟表。 然后将条件规则设为non-INSTEAD; 在应用它们的情况下,它们会添加到默认的INSTEAD NOTHING操作中。 (但是,该方法当前不适用于支持RETURNING查询。)

Note:

这是很简单的自动更新的视图(参见CREATE VIEW)以可更新并不需要用户创建的规则。 尽管您仍然可以创建显式规则,但是自动更新转换通常会胜过显式规则。

参数

name
要创建的规则的名称。 此名称必须与同一表的任何其他规则的名称不同。 同一表和同一事件类型上的多个规则以字母名称顺序应用。
event
该事件是SELECTINSERTUPDATEDELETE之一。
table_name
规则所适用的表或视图的名称(可以由模式指定)。
condition
任何SQL条件表达式(返回布尔值)。 条件表达式可能不引用除NEWOLD以外的任何表,并且可能不包含聚合函数。 NEWOLD引用参考表中的值。 NEWON INSERTON UPDATE规则中有效,以引用要插入或更新的新行。 OLDON UPDATEON DELETE规则中有效,以引用要更新或删除的现有行。
INSTEAD
INSTEAD NOTHING指示应执行的命令而不是原始命令。
ALSO
ALSO指示除了原始命令外,还应该执行命令。 如果未指定ALSOINSTEAD,则默认为ALSO
command
组成规则操作的一个或多个命令。 有效的命令是SELECTINSERTUPDATEDELETE。 特殊表名NEWOLD可以用来引用引用表中的值。 NEWON INSERTON UPDATE规则中有效,以引用要插入或更新的新行。 OLDON UPDATEON DELETE规则中有效,以引用要更新或删除的现有行。

注解

您必须是表的所有者才能创建或更改该表的规则。

注意避免循环规则非常重要。递归规则在规则创建时未得到验证,但是将在执行时报告错误。

示例

创建一个规则,当用户尝试向分区的父表rank中插入行时,将行插入到子表b2001中:

CREATE RULE b2001 AS ON INSERT TO rank WHERE gender='M' and
year='2001' DO INSTEAD INSERT INTO b2001 VALUES (NEW.id,
NEW.rank, NEW.year, NEW.gender, NEW.count);

兼容性

CREATE RULE是Greenplum数据库语言的扩展,整个查询重写系统也是如此。