麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > PostgreSQL > 正文

PostgreSQL7.0手冊-用戶手冊-19. SQL命令-CREATE RULE

2019-09-08 23:32:57
字體:
來源:轉載
供稿:網友
CREATE RULE
名稱
CREATE RULE ― 定義一個新規則 

語法
CREATE RULE name AS ON event
    TO object [ WHERE condition ]
    DO [ INSTEAD ] [ action | NOTHING ]
輸入
name 
創建的規則名. 
event 
事件是 select, update, delete 或 insert 之一. 
object 
對象是 table 或 table.column. 
condition 
任何 SQL WHERE 語句.new 或 current 可以取代記錄變量出現在任何 SQL 允許記錄變量的地方. 
action 
任何 SQL 語句. new 或 current 可以取代記錄變量出現在任何 SQL 允許記錄變量的地方. 
輸出
CREATE 
成功創建規則后的返回信息. 

描述
Postgres 規則系統 允許我們在從數據庫或表中更新,插入或刪除東西時定義一個可選的動作來執行。目前,規則用于實現表視圖。 
規則的語意是在一個單獨的記錄正被訪問,更新,插入或刪除時,將存在一個舊記錄(用于檢索,更新和刪除)和一個新記錄(用于更新和追加).如果在 ON 子句里所聲明的 event 和在 WHERE 語句里面所聲明的 condition 對于舊記錄都為真,那么action 部分的規則就被執行.但是,舊記錄的各字段值和/或新記錄將先用 current.attribute-name 和 new.attribute-name 取代. 

規則 action 部分執行時的命令和事務標識與激活該規則的用戶命令相同. 

注意
一個關于 SQL 規則的注意事項是順序.如果相同的表名或記錄變量出現在規則的 event,condition 和 action 部分.它們將會被認為是不同的記錄變量.更準確地說,只有 new 和 current 在這些子句中共享記錄變量.比如,下面兩條規則有相同的語意: 
ON UPDATE TO emp.salary WHERE emp.name = "Joe"
    DO 
        UPDATE emp SET ... WHERE ...
ON UPDATE TO emp-1.salary WHERE emp-2.name = "Joe"
    DO 
        UPDATE emp-3 SET ...  WHERE ...
每條規則都可以有可選的標記 INSTEAD.沒有這個標記,action 將在規則的條件(condition )部分的事件(event )發生時作為用戶命令的附加部分執行.否則,動作( action )部分將取代用戶命令執行.對于后者,action 可以是關鍵字 NOTHING. 
特別要指出的是重寫(rewrite)規則系統既不檢測也不執行循環規則.例如,盡管下面兩條規則都被Postgres 所接受,檢索命令將導致 Postgres 報錯,因為該查詢循環太多次: 

例 19-1. 循環重寫(rewrite)規則樣例. 

CREATE RULE bad_rule_combination_1 AS
    ON SELECT TO emp
    DO INSTEAD 
        SELECT TO toyemp;
CREATE RULE bad_rule_combination_2 AS
    ON SELECT TO toyemp
    DO INSTEAD 
        SELECT TO emp;
下面試圖從 EMP 中檢索將導致 Postgres產生一個錯誤,因為查詢循環了太多圈. 
SELECT * FROM emp;
你必須具有對某個表進行規則定義的權限,這樣才能在其上面定義規則.使用 GRANT 和 REVOKE 更改權限. 
一條 SQL 規則里的對象不能是一個數組引用和不能有參數。 

除了 "oid" 字段,一個規則里任何地方都不能引用系統表屬性。這意味著在規則里任何地方都不能調用實例/記錄函數(比如, "foo(emp)" 這里 "emp" 是一個表). 

規則系統將規則文本和查詢規劃按文本(text)屬性存儲.這意味著當創建的規則加上各種其內部表達式超過一次存儲頁面請求的值(8KB)時,規則創建可能失敗。

用法
令 Sam 獲得與 Joe 一樣的薪水調整: 
CREATE RULE example_1 AS
    ON UPDATE emp.salary WHERE old.name = "Joe"
    DO 
        UPDATE emp 
        SET salary = new.salary
        WHERE emp.name = "Sam";
當 Joe 獲得薪水調整后,事件將為真以及Joe的當前記錄和提供的新記錄可被執行過程獲得.因此,他的新薪水將代入動作部分,隨后動作部分被執行.這樣Sam的薪水就會和Joe的一樣了. 
當Bill訪問數據庫(薪水)時,令 Bill 獲得 Joe 薪水的信息. 

CREATE RULE example_2 AS
    ON SELECT TO EMP.salary
    WHERE old.name = "Bill"
    DO INSTEAD
        SELECT emp.salary
        FROM emp
        WHERE emp.name = "Joe";
拒絕 Joe 訪問雇員的薪水,當他在鞋部時 (current_user 返回當前用戶的名稱): 
CREATE RULE example_3 AS
    ON 
        SELECT TO emp.salary
        WHERE old.dept = "shoe" AND current_user = "Joe"
    DO INSTEAD NOTHING;
創建一個玩具部工作的雇員視圖. 
CREATE toyemp(name = char16, salary = int4);

CREATE RULE example_4 AS
    ON SELECT TO toyemp
    DO INSTEAD
        SELECT emp.name, emp.salary
        FROM emp
        WHERE emp.dept = "toy";
All new employees must make 5,000 or less 
CREATE RULE example_5 AS
    ON INERT TO emp WHERE new.salary > 5000
    DO 
        UPDATE NEWSET SET salary = 5000;
兼容性
SQL92
CREATE RULE 語句是 Postgres 語言的擴展.在 SQL92 里沒有 CREATE RULE 語句.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 久草在线综合网 | 国产精品视频久久久 | 久久精品高清 | 在线小视频国产 | 毛片网站视频 | 国产一区视频在线免费观看 | 九九热九九爱 | 久久国产精 | 精品国产中文字幕 | 女人一级一级毛片 | 成人不卡免费视频 | 9999精品| 动漫孕妇被羞羞视频 | 欧美aⅴ在线观看 | 嗯哈~不行好大h双性 | 亚洲欧美一区二区三区在线观看 | 成人国产精品免费 | 亚洲视频在线观看免费视频 | 黑人一区二区 | 日韩精品久久久久久久电影99爱 | 国产精品久久久久久久av | 一级做受毛片免费大片 | 精品国产一区二区亚洲人成毛片 | 国产自在线 | 国产午夜精品一区二区三区免费 | 国产精品9191 | 99热久草 | 伦理三区 | 欧美日韩高清不卡 | 精品一区二区视频在线观看 | 一本一道久久久a久久久精品91 | 最新亚洲视频 | 国产精品成人一区二区三区吃奶 | 亚洲免费视频大全 | 欧美1—12sexvideos | 黄视频网站免费在线观看 | 内地av在线 | 久久精品一区二区三区四区五区 | 日韩视频精品一区 | 日本一区二区三区视频在线 | 在线天堂资源 |