久しぶりの更新。
PostgreSQLで複雑なviewを作成した場合に、どのテーブルを使用しているのか
または場合によってはview内に他のviewを多用した結果、修正が必要となった場合に
dropするにも依存関係を確認してから。。。
というようなことまれにありませんか?
僕は極力、with句を使ってview内に別のviewを使うことを避けてはおりますが、
誰かが作ったものを引き継ぐ等で避けられない時も多々あったりします。
今日はPostgreSQLのtableやviewの依存を調べる簡易SQLを紹介します。
テーブルとビューの準備
以下のようなテーブルとビューを作成します。
--tableの作成
create table table01 (testid int);
create table table02 (testid int);
--viewの作成
create view view01 as select * from table01;
create view view02 as select * from view01;
create view view03 as select * from view01;
create view view04 as select * from view02 union all select * from view03;
create view view05 as select * from table01 union all select * from table02;
・table01とtable02のテーブルを作成します。
・table01から成るビューview01を作成します。
・view01から成るビューview02を作成します。
・view01から成るビューview03を作成します。
・view02とview03から成るビューview04を作成します。
・table01とtable02から成るビューview05を作成します。
テーブルやビューの依存関係を表示するSQL
早速。
select distinct
d.refobjid as id1
,c1.relname as name1
,c1.relkind as kind1
,case c1.relkind when 'r' then 'table' when 'v' then 'view' else '' end as kindname1
,d.objid as id2
,c2.relname as name2
,c2.relkind as kind2
,case c2.relkind when 'r' then 'table' when 'v' then 'view' else '' end as kindname2
from pg_depend d
inner join pg_class c1
on d.refobjid = c1.oid
and c1.relkind in ('r','v') --r=table, v=view
and c1.relnamespace = (select oid from pg_namespace where nspname = 'public')
and d.refobjsubid != 0
inner join pg_rewrite r
on d.objid = r.oid
inner join pg_class c2
on r.ev_class = c2.oid
and c2.relkind in ('r','v') --r=table, v=view
order by d.refobjid
,d.objid
結果は以下の通り。
こちらのシステムカタログを参考にしました。
解説という解説はしませんが。。。
多分。あってます。。。と思います。
pg_depend
https://www.postgresql.jp/document/12/html/catalog-pg-depend.html
pg_class
https://www.postgresql.jp/document/12/html/catalog-pg-class.html
pg_rewrite
https://www.postgresql.jp/document/12/html/catalog-pg-rewrite.html
pg_dependの構成を見ていると再帰処理で対応するという方法もありそうですね。
かなり雑な記事ではございますが、ぜひお試しください。
では。