規則系統
規則系統
查詢重寫規劃的系統。從使用上說,規則系統上的一些功能也可以通過函式和觸發器來實現,但規則系統與觸發器完全不同,它是在執行前把使用者發過來的sql通過內部的規則定義改變成另乙個sql後再執行的一種方式
select規則
pg檢視是通過select規則實現的,建立檢視的命令:
create view myview as select * from mytab;
等同於create table myview (same column list as mytab);
create rule "_return" as on select to myview do instead select * from mytab;
檢視實際上一張表,不過是在這張表中加了乙個select規則
更新規則
建立更新規則的語法:
create [ or replace ] rule name as on event
to table_name [ where condition ]
do [ also | instead ]
這裡的更新規則就是指事務為「insert」、「update」、「delete」的三種規則
event的值:
*select:sql查詢計畫中存在查詢表的操作時會重寫查詢計畫
*insert:sql查詢計畫中存在向表中插入資料的操作時會重寫查詢計畫
*update:sql查詢計畫中存在向表中更新資料的操作時會重寫查詢計畫
*delete:sql查詢計畫中存在將表中資料刪除的操作時會重寫查詢計畫
語法中關鍵字「also」與「instead」的說明為:
*also:除執行原本操作外,還執行一些附加操作,這些附加操作由後面的 「command」指定
*instead:用後面的「command」操作取代原操作
*nothing:什麼都不執行
規則和許可權
規則(rule)是從屬於表或檢視的。如果一張表屬於乙個使用者,則這張表上的所有規則都屬於這個使用者。由於pg規則系統對查詢進行了重寫,因此通過規則系統使用者可以間接訪問到其他表
因規則而使用的關係要對定義規則的屬主進行許可權檢查,而不是檢查執行規則的使用者,這意味著乙個使用者只需要對查詢裡明確指定的表/檢視擁有所需的許可權就可以進行操作
規則和命令狀態
pg 伺服器會為收到的每個命令返回乙個命令狀態字串,用以表示這條sql影響的行數(對於insert返回當前行的oid)
如果查詢中存在有條件的instead規則(建立規則時指定了where子句),那麼規則的條件就會加到最初的查詢裡,這可能會導致查詢處理的資料行數減少,從而使sql執行結果狀態中返回的行數也變少。如果查詢中無任何instead規則,原始查詢會完整執行,那麼結果中的狀態行數就不會發生變化
如果查詢有任何乙個無條件的instead規則,那麼最初的查詢語句將不會被執行。在這種情況下,伺服器返回的命令狀態為:與由instead規則(條件的或非條件的)插入的最後一條和最初查詢語句命令型別(instead、update、delete)相同的sql語句的命令狀態。如果規則新增的查詢都不符合這些要求,那麼返回的命令狀態顯示源查詢型別,而影響的行數和oid欄位為零
規則與觸發器的比較
從外部導資料的命令「copy from」會讓觸發器執行,但不會呼叫規則系統
觸發器能做的很多事情,使用pg規則系統也可以完成,使用哪種方法取決於具體的應用場景。規則系統是通過查詢重寫來實現的,而觸發器通常是為每乙個行都觸發執行一次,所以對於批量操作,如果使用規則,可能會生成更好的執行計畫,從而提高效率
規則修改查詢或生成額外的查詢,不容易理解,觸發器的方法在概念上比規則的方法簡單,更容易掌握
pg表中的系統列
oid 物件id,預設是隱藏不顯示的,在建立表的時候使用了with oids會顯示這個列 select oid.from t test 錯誤 error column oid does not exist sql 狀態 42703 字元 8 create table t test id intege...
PG系統表之pg class
pg class記錄表 索引 序列 檢視等物件的資訊。pg class 名稱型別 引用描述 oidoid 行識別符號 relnamename 表 索引 檢視等的名字 relnamespaceoidpg namespace.oid包含該關係的名字空間的oid reltypeoidpg type.oid...
Sentinel 熱點規則 系統規則
將商品檢視介面看做成乙個 sentinelresource sentinelresource value getorder public orderinfo getinfo pathvariable long id,authenticationprincipal string username 在 ...