在使用資料庫時,如果用到了視圖,物化視圖。
在表,視圖,物化視圖這些對象之間就會産生依賴。
例如
如果要改t的字段,或者删除t表。 會怎樣呢?
使用drop table t cascade可以自動删除依賴對象。
如果是改字段,對不起,需要把依賴對象先删掉,并重建依賴對象。
drop的時候,會通過reportdependentobjects函數列印依賴t表的視圖。
代碼如下
但是我們不drop怎麼知道依賴關系呢?
視圖和物化視圖其實都在pg_rewrite中,通過查詢ev_action就可以得到定義。
通過解析這個規則,可以得到依賴的對象oid。
建立一個解析函數,得到依賴的oid
例子
查詢v1依賴的對象oid
再建立一個函數,遞歸的得到依賴的對象。
例子 :
查詢所有直接或間接依賴t表的對象
查到直接和間接依賴t表的對象有v5,v6,v1,v2,v3,v4,vv1v,vv1v1, 和之前drop table t的報錯内容一緻。
是不是很帥呢
拿到依賴關系後,我們還可以通過pg_get_viewdef拿到視圖的定義
遞歸文法請參考我之前寫的文章
<a href="https://yq.aliyun.com/articles/54657">https://yq.aliyun.com/articles/54657</a>
主要用到的技巧
.1. 規則表達式比對 regexp_matches
<a href="https://www.postgresql.org/docs/9.6/static/functions-matching.html">https://www.postgresql.org/docs/9.6/static/functions-matching.html</a>
.2. 遞歸查詢 with recursive query