CREATE RULE
Name
CREATE RULE — 定义一个新规则
CREATE RULE name AS ON event
TO object [ WHERE condition ]
DO [ INSTEAD ] action
这里 action 可以是:
NOTHING
|
query
|
( query ; query ... )
|
[ query ; query ... ]
输入
-
name
-
创建的规则名.
-
event
-
事件是 SELECT, UPDATE,DELETE 或 INSERT 之一.
-
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 规则里可以指向现存的被选择,更新,或者删除的行.
描述
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 报告 一条错误信息,因为该查询循环了太多次:
Example 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 语句.
|----------------------------------------------------------------------------------------|
版权声明 版权所有 @zhyiwww
引用请注明来源 http://www.blogjava.net/zhyiwww
|----------------------------------------------------------------------------------------|
posted on 2006-06-02 18:51
zhyiwww 阅读(291)
评论(0) 编辑 收藏 所属分类:
database