PostgreSQL10.0preview功能增強-觸發器函式內建中間表
標籤
PostgreSQL , 10.0 , 觸發器 , 中間表 , OLD , NEW
背景
在觸發器中,如果要提取觸發該事件的記錄,使用OLD和NEW關鍵字。
OLD.* , NEW.* 提取
對於for statement after觸發器,觸發的記錄數可能是很多的,PostgreSQL 10.0增加了一個功能,中間表。
在觸發器函式中,可以使用這個中間表,中間表的資料就是觸發器涉及的資料,中級鏢的功能支援after觸發器(因為after後才有全部的記錄呀)。
語法
[ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
[ FOR [ EACH ] { ROW | STATEMENT } ]
例子
1. 建立一個測試表
+CREATE TABLE transition_table_base (id int PRIMARY KEY, val text);
2. 建立一個觸發器函式,其中newtable, oldtable分別是中間表,中間表不需要定義,就是觸發器對應的表結構。
+CREATE OR REPLACE FUNCTION transition_table_base_upd_func()
+ RETURNS trigger
+ LANGUAGE plpgsql
+AS $$
+DECLARE
+ t text;
+ l text;
+BEGIN
+ t = ``;
+ FOR l IN EXECUTE
+ $q$
+ EXPLAIN (TIMING off, COSTS off, VERBOSE on)
+ SELECT * FROM oldtable ot FULL JOIN newtable nt USING (id)
+ $q$ LOOP
+ t = t || l || E`
`;
+ END LOOP;
+
+ RAISE INFO `%`, t;
+ RETURN new;
+END;
+$$;
3. 建立for statement after觸發器,指定old table名字叫做oldtable, new table名字叫做newtable。
注意update支援old,new table, insert支援new table, delete支援old table
+CREATE TRIGGER transition_table_base_upd_trig
+ AFTER UPDATE ON transition_table_base
+ REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
+ FOR EACH STATEMENT
+ EXECUTE PROCEDURE transition_table_base_upd_func();
4. 測試,可以看到觸發器輸出的內容,oldtable, newtable實際上就是transition_table_base表的表結構。
對應的就是原來常用的OLD, NEW關鍵字,只是以中間表的形式體現。
+UPDATE transition_table_base
+ SET val = `*` || val || `*`
+ WHERE id BETWEEN 2 AND 3;
+INFO: Hash Full Join
+ Output: COALESCE(ot.id, nt.id), ot.val, nt.val
+ Hash Cond: (ot.id = nt.id)
+ -> Named Tuplestore Scan
+ Output: ot.id, ot.val
+ -> Hash
+ Output: nt.id, nt.val
+ -> Named Tuplestore Scan
+ Output: nt.id, nt.val
中間表有什麼用呢?
某些場景中,可以使用”for each statement+中間表” 替代for each row,因為for each statement是末尾觸發,效能更好。
這個patch的討論,詳見郵件組,本文末尾URL。
PostgreSQL社群的作風非常嚴謹,一個patch可能在郵件組中討論幾個月甚至幾年,根據大家的意見反覆的修正,patch合併到master已經非常成熟,所以PostgreSQL的穩定性也是遠近聞名的。
參考
https://www.postgresql.org/docs/devel/static/sql-createtrigger.html
相關文章
- PostgreSQL10.0preview功能增強-JSON內容全文檢索SQLViewJSON
- PostgreSQL10.0preview功能增強-國際化功能增強,支援ICU(InternationalComponentsforUnicode)SQLViewUnicode
- PostgreSQL10.0preview功能增強-增加ProcArrayGroupUpdate等待事件SQLView事件
- PostgreSQL10.0preview效能增強-hashindexmetapagecache、高併發增強SQLViewIndex
- Python巢狀定義函式增強reduce()函式功能Python巢狀函式
- PostgreSQL10.0preview效能增強-分割槽表效能增強(plan階段加速)SQLView
- PostgreSQL10.0preview效能增強-間接索引(secondaryindex)SQLView索引Index
- PostgreSQL10.0preview功能增強-OLAP增強向量聚集索引(列儲存擴充套件)SQLView索引套件
- PostgreSQL10.0preview功能增強-CLOGoldestXID跟蹤SQLViewGo
- PostgreSQL LIST分割槽實現:繼承表+函式+觸發器。SQL繼承函式觸發器
- PostgreSQL10.0preview功能增強-後臺執行(pg_background)SQLView
- PostgreSQL10.0preview功能增強-自由定義統計資訊維度SQLView
- MySQL怎麼利用函式和觸發器實現非主鍵自增?MySql函式觸發器
- 七、函式-儲存過程-觸發器函式儲存過程觸發器
- oracle 臨時表 解決 "表 *** 發生了變化,觸發器/函式不能讀"的問題Oracle觸發器函式
- sql內建函式pivot強大的行轉列功能SQL函式
- PostgreSQL10.0preview功能增強-更強可靠性,過去式事務狀態可查(杜絕unknown事務)SQLView
- ORA-04091 觸發器/函式不能讀觸發器函式
- PostgreSQL10.0preview功能增強-兩段式索引(約束欄位+附加欄位)SQLView索引
- PostgreSQL10.0preview功能增強-邏輯訂閱端控制引數解說SQLView
- Oracle11gr2觸發器依賴判斷增強(二)Oracle觸發器
- Oracle11gr2觸發器依賴判斷增強(一)Oracle觸發器
- DB2_建立在臨時表上的檢視-過程-表函式-觸發器DB2函式觸發器
- PostgreSQL10.0preview功能增強-序列隔離級別預加鎖閾值可控SQLView
- oracle 觸發器-表同步Oracle觸發器
- oracle 建立表,序列,索引,檢視,觸發器,函式,儲存過程,定時器,包體Oracle索引觸發器函式儲存過程定時器
- 破解儲存過程,函式,檢視,觸發器解密儲存過程函式觸發器解密
- PostgreSQL10.0preview效能增強-支援64bitatomicSQLView
- Oracle Database 19c 中的 JSON_OBJECT 函式的增強功能OracleDatabaseJSONObject函式
- mysql一些複製表、增刪改索引、建儲存過程、建立函式、建立觸發器的一些命令MySql索引儲存過程函式觸發器
- Oracle 表 XXXXX 發生了變化, 觸發器/函式不能讀它.Oracle觸發器函式
- javascript 事件觸發以後函式指定時間後再執行JavaScript事件函式
- PostgreSQL10.0preview功能增強-客戶端ACL(pg_hba.conf動態檢視)SQLView客戶端
- PostgreSQL10.0preview功能增強-回滾範圍可精細控制(事務、語句級)SQLView
- PostgreSQL10.0preview功能增強-邏輯複製支援並行COPY初始化資料SQLView並行
- PostgreSQL10.0preview效能增強-OLAP提速框架,FasterExpressionEvaluationFramework(含JIT)SQLView框架ASTExpressFramework
- withoutEvents函式裡面的事件被觸發函式事件
- js程式碼觸發事件 函式列表JS事件函式