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 阅读(314) 
评论(0)  编辑  收藏  所属分类: 
database