天天看點

PostgreSQL 遞歸SQL 找出對象依賴

在使用資料庫時,如果用到了視圖,物化視圖。

在表,視圖,物化視圖這些對象之間就會産生依賴。

例如

如果要改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