Provided by: manpages-zh_1.5-1_all bug

NAME

       CREATE RULE - 定義一虓s的姨g規則

SYNOPSIS

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

DESCRIPTIONyz
       CREATE  RULE  定義一蚞A用於特定表或者視圖的新規則。  CREATE  OR REPLACE
       RULE n麼是創建一虓s規則, n麼是用一茼P表上的同名規則替換現有規則。

       PostgreSQL規則系統允許我怞b從數據庫或表中更新, 插入或刪除東西時定義一-
       茖銗扛滌囮@來執行。                               簡單說,規則就是當我-
       怞b指定的表上執行指定的動作的時唌A導P一些額外的動作被執行。
       另外,規則可以用另外一茤R令取代某荅S定的命令,或者令命令完全不被執行。
       規則還用於實現表視圖。我帔明白的是規則實際上只是一-
       茤R令轉換機制,或者說命令宏。
       這種轉換發生在命令開始執行之前。如果你實際上想n一茯馬C-
       茠垓z行獨立發生的操作,                            那麼你可能還是n用一-
       蚅眶o器,而不是規則。有關規則的更多信息可以在   ``The   Rule   System''
       找到。

        目前,ON  SELECT  規則必須是無條件的  INSTEAD  規則並且必須有一茈悀@條
       SELECT       查詢組成的動作。        因此,一條        ON        SELECT
       規則有效地把對象表轉成視圖,         它的可見內容是規則的        SELECT
       查詢返回的記錄而不是存儲在表中的內容(如果有的話)。      我抳{為寫一條
       CREATE VIEW 命令比創建一茠穔M後定義一條 ON SELECT 規則在上悸熒格n好。

        你可以創建一茈i以更新的視圖的幻覺,  方法是在視圖上定義  ON INSERT,ON
       UPDATE,和        ON        DELETE         規則(或者滿足你需n的任何上-
       z規則的子集),用合適的對其它表的更新替換在視圖上更新的動作。

        如果你想在視圖更新上使用條件規則,那麼這裏就有一虒犮R:
       對你希望在視圖上允許的每荌囮@,你都必須有一茧L條件的   INSTEAD   規則。
       如果規則是有條件的,或者它不是                                INSTEAD,
       那麼系統仍將拒絕執行更新動作的企圖,因為它認為它最終會在某種程度上在虛擬表上執行動作。
       如果你想處理條件規則上的所由有用的情況,那也可以;只需n增加一茧L條件的
       DO                           INSTEAD                            NOTHING
       規則確保系統明白它將決不會被調用來更新虛擬表就可以了。
       然後把條件規則做成非      INSTEAD;在這種情況下,如果它抭Q觸發,那麼它-
       抴N增加到預設的 INSTEAD NOTHING  動作中。

PARAMETERS數
       name     創建的規則名。它必須在同一茠矰W的所有規則的名字中唯一。  同一-
              茠矰W的同一茖鬊型的規則是按照字母順序運行的。

       event   事件是 SELECT, UPDATE,DELETE  或 INSERT 之一。

       table   規則施用的表或者視圖的名字(可以有模式袡╮^。

       condition
               任意 SQL 條件表達式(返回 boolean)。 條件表達式除了引用 NEW 和
              OLD 之外不能引用任何表,並且不能有聚集函數。

       command
               組成規則動作的命令。有效的命令是               SELECT,INSERT,
              UPDATE,DELETE,或 NOTIFY 語句之一。

        在   condition    和   command   裏,   特殊表名字    NEW    和    OLD
       可以用於指向被引用表裏的數   new   在   ON   INSERT   和   ON   UPDATE
       規則裏可以指向被插入或更新的新行。  OLD  在  ON  UPDATE,和  ON  DELETE
       規則裏可以指向現存的被更新,或者刪除的行。

NOTES`N
        為了在表上定義規則,你必須有 RULE 權。

        有一件很南的事情是n避免循環規則。        比如,儘管下惆漹瓥W則定義都是
       PostgreSQL   可以接受的,   但一條    SELECT    命令會導P    PostgreSQL
       報告一條錯誤訊息,因為該查詢循環了太多次:

       CREATE RULE "_RETURN" AS
           ON SELECT TO t1
           DO INSTEAD
            SELECT * FROM t2;

       CREATE RULE "_RETURN" AS
           ON SELECT TO t2
           DO INSTEAD
            SELECT * FROM t1;

       SELECT * FROM t1;

        目前,如果一茬W則包含一 NOTIFY 查詢,那麼該 NOTIFY 將被無條件執行 ---
       也就是說,如果規則不施加到任何行上頭, 該 NOTIFY 也會被發出。比如,在

       CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;

       UPDATE mytable SET name = 'foo' WHERE id = 42;

        裏,一  NOTIFY  事件將在  UPDATE  的時埽o出,不管是否有某行的  id   =
       42。這是一蚢窶{的制,將來的版本應該袑伈o茪繶f。

COMPATIBILITYe性
       CREATE RULE 是 PostgreSQL  語言的擴展,整茬W則系統也是如此。

者
       Postgresql  <laser@pgsqldb.org>