zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0

          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

          事件是 SELECTUPDATEDELETEINSERT 之一.

          object

          對象是 tabletable.column. (目前只有 table 形式實際上是實現了的.

          condition

          任意 SQL 布爾條件表達式.條件表達式除了引用 newold 之外不能引用任何表.

          query

          組成 action 的查詢可以是任何 SQL SELECTINSERTUPDATEDELETE,或 NOTIFY 語句之一.

          conditionaction 里, 特殊表名字 newold 可以用于指向引用表 ( object) 里的數值 new 在 ON INSERT 和 ON UPDATE 規則里 可以指向被插入或更新的新行. old 在 ON SELECT,ON UPDATE,和 ON DELETE 規則里可以指向現存的被選擇,更新,或者刪除的行.

          輸出

          CREATE

          成功創建規則后的返回信息.

          描述

          Postgres 規則系統 允許我們在從數據庫或表中更新, 插入或刪除東西時定義一個可選的動作來執行。目前,規則用于實現表視圖。

          規則的語意是在一個單獨的記錄正被訪問,更新,插入或刪除時, 將存在一個舊記錄(用于檢索,更新和刪除)和一個新記錄 (用于更新和追加). 這時給定事件類型和給定目標對象(表)的所有規則都將被檢查, (順序不定). 如果在 WHERE (如果有)子句里面所聲明的 condition? 為真,那么 action 部分的規則就被執行. 如果聲明了 INSTEAD,那么 action 就會代替原來的查詢;否則它在執行原來的查詢之前處理. 在 conditionaction 里面, 在舊記錄里字段的數值和/或新記錄里字段的數值被 old.attribute-namenew.attribute-name 代替.

          規則的 action 部分可以由一條或者多條查詢組成.要寫多個查詢,用圓括弧或者方括弧 把它們包圍起來. 這樣的查詢將以聲明的順序執行(只是我們不能保證 對一個對象的多個規則的執行順序). action 還可以是 NOTHING 表示沒有動作.因此,一個 DO INSTEAD NOTHING 規則制止了 原來的查詢的運行(當條件為真時); DO NOTHING 規則是沒有用的.

          規則的 action 部分 執行的時候帶有和觸發動作的用戶命令相同的命令和事務標識符.

          注意

          目前,ON SELECT 規則必須是無條件的 INSTEAD 規則并且 必須有一個由一條 SELECT 查詢組成的動作. 因此,一條 ON SELECT 規則有效地把對象表轉成視圖,它的可見內容 是規則的 SELECT 查詢返回的記錄而不是存儲在表中的內容(如果有的話). 我們認為寫一條 CREATE VIEW 命令比創建一個表然后定義一條 ON SELECT 規則在上面的風格要好.

          為了在表上定義規則,你必須有規則定義權限. 用 GRANTREVOKE 修改權限.

          有一件很重要的事情是要避免循環規則. 比如,盡管下面兩條規則定義都是 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.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2006-06-02 18:51 zhyiwww 閱讀(300) 評論(0)  編輯  收藏 所屬分類: database
          主站蜘蛛池模板: 嘉荫县| 高阳县| 大宁县| 志丹县| 岗巴县| 蒲江县| 延吉市| 吐鲁番市| 五大连池市| 济宁市| 宜君县| 孟津县| 万山特区| 安吉县| 大理市| 若羌县| 阳泉市| 南乐县| 邵阳县| 崇州市| 衡阳市| 益阳市| 光泽县| 鄂托克前旗| 中方县| 长春市| 海兴县| 古浪县| 邵阳市| 故城县| 天门市| 柯坪县| 盐亭县| 逊克县| 扶沟县| 特克斯县| 厦门市| 南华县| 吉林省| 宝应县| 阳朔县|