国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > PostgreSQL > 正文

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

2019-09-08 23:32:57
字體:
供稿:網(wǎng)友
CREATE RULE
名稱
CREATE RULE ― 定義一個(gè)新規(guī)則 

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

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

規(guī)則 action 部分執(zhí)行時(shí)的命令和事務(wù)標(biāo)識與激活該規(guī)則的用戶命令相同. 

注意
一個(gè)關(guān)于 SQL 規(guī)則的注意事項(xiàng)是順序.如果相同的表名或記錄變量出現(xiàn)在規(guī)則的 event,condition 和 action 部分.它們將會被認(rèn)為是不同的記錄變量.更準(zhǔn)確地說,只有 new 和 current 在這些子句中共享記錄變量.比如,下面兩條規(guī)則有相同的語意: 
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 ...
每條規(guī)則都可以有可選的標(biāo)記 INSTEAD.沒有這個(gè)標(biāo)記,action 將在規(guī)則的條件(condition )部分的事件(event )發(fā)生時(shí)作為用戶命令的附加部分執(zhí)行.否則,動作( action )部分將取代用戶命令執(zhí)行.對于后者,action 可以是關(guān)鍵字 NOTHING. 
特別要指出的是重寫(rewrite)規(guī)則系統(tǒng)既不檢測也不執(zhí)行循環(huán)規(guī)則.例如,盡管下面兩條規(guī)則都被Postgres 所接受,檢索命令將導(dǎo)致 Postgres 報(bào)錯(cuò),因?yàn)樵摬樵冄h(huán)太多次: 

例 19-1. 循環(huán)重寫(rewrite)規(guī)則樣例. 

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 中檢索將導(dǎo)致 Postgres產(chǎn)生一個(gè)錯(cuò)誤,因?yàn)椴樵冄h(huán)了太多圈. 
SELECT * FROM emp;
你必須具有對某個(gè)表進(jìn)行規(guī)則定義的權(quán)限,這樣才能在其上面定義規(guī)則.使用 GRANT 和 REVOKE 更改權(quán)限. 
一條 SQL 規(guī)則里的對象不能是一個(gè)數(shù)組引用和不能有參數(shù)。 

除了 "oid" 字段,一個(gè)規(guī)則里任何地方都不能引用系統(tǒng)表屬性。這意味著在規(guī)則里任何地方都不能調(diào)用實(shí)例/記錄函數(shù)(比如, "foo(emp)" 這里 "emp" 是一個(gè)表). 

規(guī)則系統(tǒng)將規(guī)則文本和查詢規(guī)劃按文本(text)屬性存儲.這意味著當(dāng)創(chuàng)建的規(guī)則加上各種其內(nèi)部表達(dá)式超過一次存儲頁面請求的值(8KB)時(shí),規(guī)則創(chuàng)建可能失敗。

用法
令 Sam 獲得與 Joe 一樣的薪水調(diào)整: 
CREATE RULE example_1 AS
    ON UPDATE emp.salary WHERE old.name = "Joe"
    DO 
        UPDATE emp 
        SET salary = new.salary
        WHERE emp.name = "Sam";
當(dāng) Joe 獲得薪水調(diào)整后,事件將為真以及Joe的當(dāng)前記錄和提供的新記錄可被執(zhí)行過程獲得.因此,他的新薪水將代入動作部分,隨后動作部分被執(zhí)行.這樣Sam的薪水就會和Joe的一樣了. 
當(dāng)Bill訪問數(shù)據(jù)庫(薪水)時(shí),令 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 訪問雇員的薪水,當(dāng)他在鞋部時(shí) (current_user 返回當(dāng)前用戶的名稱): 
CREATE RULE example_3 AS
    ON 
        SELECT TO emp.salary
        WHERE old.dept = "shoe" AND current_user = "Joe"
    DO INSTEAD NOTHING;
創(chuàng)建一個(gè)玩具部工作的雇員視圖. 
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 語言的擴(kuò)展.在 SQL92 里沒有 CREATE RULE 語句.
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 镇雄县| 彭水| 长海县| 龙陵县| 新河县| 东港市| 乐亭县| 合阳县| 林芝县| 新沂市| 长武县| 天津市| 宜春市| 军事| 龙胜| 安康市| 禄劝| 黎城县| 阜南县| 岢岚县| 元谋县| 梁山县| 新建县| 天镇县| 聂荣县| 呼伦贝尔市| 临湘市| 泌阳县| 汶上县| 洛宁县| 民乐县| 通化市| 南平市| 威海市| 阿巴嘎旗| 南陵县| 崇信县| 巴彦县| 永川市| 邢台市| 临邑县|