CREATE RULE
CREATE RULE name AS ON event TO object [ WHERE condition ] DO [ INSTEAD ] action 這里 action 可以是: NOTHING | query | ( query ; query ... ) | [ query ; query ... ]
輸入
- name
-
創(chuàng)建的規(guī)則名.
- event
-
事件是 SELECT, UPDATE,DELETE 或 INSERT 之一.
- object
-
對象是 table 或 table.column. (目前只有 table 形式實(shí)際上是實(shí)現(xiàn)了的.
- condition
-
任意 SQL 布爾條件表達(dá)式.條件表達(dá)式除了引用 new 和 old 之外不能引用任何表.
- query
-
組成 action 的查詢可以是任何 SQL SELECT,INSERT, UPDATE,DELETE,或 NOTIFY 語句之一.
在 condition 和 action 里, 特殊表名字 new 和 old 可以用于指向引用表 ( object) 里的數(shù)值 new 在 ON INSERT 和 ON UPDATE 規(guī)則里 可以指向被插入或更新的新行. old 在 ON SELECT,ON UPDATE,和 ON DELETE 規(guī)則里可以指向現(xiàn)存的被選擇,更新,或者刪除的行.
描述
Postgres 規(guī)則系統(tǒng) 允許我們在從數(shù)據(jù)庫或表中更新, 插入或刪除東西時(shí)定義一個(gè)可選的動作來執(zhí)行。目前,規(guī)則用于實(shí)現(xiàn)表視圖。
規(guī)則的語意是在一個(gè)單獨(dú)的記錄正被訪問,更新,插入或刪除時(shí), 將存在一個(gè)舊記錄(用于檢索,更新和刪除)和一個(gè)新記錄 (用于更新和追加). 這時(shí)給定事件類型和給定目標(biāo)對象(表)的所有規(guī)則都將被檢查, (順序不定). 如果在 WHERE (如果有)子句里面所聲明的 condition? 為真,那么 action 部分的規(guī)則就被執(zhí)行. 如果聲明了 INSTEAD,那么 action 就會代替原來的查詢;否則它在執(zhí)行原來的查詢之前處理. 在 condition 和 action 里面, 在舊記錄里字段的數(shù)值和/或新記錄里字段的數(shù)值被 old.attribute-name 和 new.attribute-name 代替.
規(guī)則的 action 部分可以由一條或者多條查詢組成.要寫多個(gè)查詢,用圓括弧或者方括弧 把它們包圍起來. 這樣的查詢將以聲明的順序執(zhí)行(只是我們不能保證 對一個(gè)對象的多個(gè)規(guī)則的執(zhí)行順序). action 還可以是 NOTHING 表示沒有動作.因此,一個(gè) DO INSTEAD NOTHING 規(guī)則制止了 原來的查詢的運(yùn)行(當(dāng)條件為真時(shí)); DO NOTHING 規(guī)則是沒有用的.
規(guī)則的 action 部分 執(zhí)行的時(shí)候帶有和觸發(fā)動作的用戶命令相同的命令和事務(wù)標(biāo)識符.
注意
目前,ON SELECT 規(guī)則必須是無條件的 INSTEAD 規(guī)則并且 必須有一個(gè)由一條 SELECT 查詢組成的動作. 因此,一條 ON SELECT 規(guī)則有效地把對象表轉(zhuǎn)成視圖,它的可見內(nèi)容 是規(guī)則的 SELECT 查詢返回的記錄而不是存儲在表中的內(nèi)容(如果有的話). 我們認(rèn)為寫一條 CREATE VIEW 命令比創(chuàng)建一個(gè)表然后定義一條 ON SELECT 規(guī)則在上面的風(fēng)格要好.
為了在表上定義規(guī)則,你必須有規(guī)則定義權(quán)限. 用 GRANT 和 REVOKE 修改權(quán)限.
有一件很重要的事情是要避免循環(huán)規(guī)則. 比如,盡管下面兩條規(guī)則定義都是 Postgres 可以接受的, select 命令會導(dǎo)致 Postgres 報(bào)告 一條錯(cuò)誤信息,因?yàn)樵摬樵冄h(huán)了太多次:
Example 1. 循環(huán)重寫規(guī)則組合的例子:
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;
下面這個(gè)對 EMP 的查詢企圖將導(dǎo)致 Postgres 產(chǎn)生一個(gè)錯(cuò)誤信息, 因?yàn)樵摬樵冄h(huán)了太多次:
SELECT * FROM emp;
|----------------------------------------------------------------------------------------|
版權(quán)聲明 版權(quán)所有 @zhyiwww
引用請注明來源 http://www.aygfsteel.com/zhyiwww
|----------------------------------------------------------------------------------------|