PostgreSQL/MogDB/openGauss怎樣獲取表上依賴於該表的檢視

T1YSL發表於2022-12-12

一、實現語句

postgres=# select relnamespace,relname,relkind from pg_class where oid in(          
           select c.ev_class
     from pg_depend a,pg_depend b,pg_class pc,pg_rewrite c
    where a.refclassid=1259      
      and b.deptype='i'
      and a.classid=2618
      and a.objid=b.objid
      and a.classid=b.classid
      and a.refclassid=b.refclassid
      and a.refobjid<>b.refobjid
      and pc.oid=a.refobjid     
      and c.oid=b.objid
      and relnamespace in (select oid from pg_namespace where nspname='public') and pc.relname='t1');
 relnamespace | relname | relkind 
--------------+---------+---------
(0 rows)

二、建立一個依賴於t1表的檢視a1測試

postgres=# create view  a1 as select * from t1;
CREATE VIEW
postgres=# select relnamespace,relname,relkind from pg_class where oid in(          
           select c.ev_class
     from pg_depend a,pg_depend b,pg_class pc,pg_rewrite c
    where a.refclassid=1259      
      and b.deptype='i'
      and a.classid=2618
      and a.objid=b.objid
      and a.classid=b.classid
      and a.refclassid=b.refclassid
      and a.refobjid<>b.refobjid
      and pc.oid=a.refobjid     
      and c.oid=b.objid
      and relnamespace in (select oid from pg_namespace where nspname='public') and pc.relname='t1');
 relnamespace | relname | relkind 
--------------+---------+---------
         2200 | a1      | v
(1 row)

查詢語句裡的, a.refclassid=1259,這個1259是pg_class的oid,a.classid=2618的2618是pg_rewrite的oid。

結果裡relnamespace=2200是public這個schema的oid,可以查詢pg_namespace得到

postgres=# select oid,nspname from pg_namespace where oid=2200;
 oid  | nspname 
------+---------
 2200 | public
(1 row)

因此依賴於public.t1的檢視是public.a1。

三、MogDB/openGauss也可以用同樣的方法

MogDB=# select relnamespace,relname,relkind from pg_class where oid in(          
MogDB(#            select c.ev_class
MogDB(#      from pg_depend a,pg_depend b,pg_class pc,pg_rewrite c
MogDB(#     where a.refclassid=1259      
MogDB(#       and b.deptype='i'
MogDB(#       and a.classid=2618
MogDB(#       and a.objid=b.objid
MogDB(#       and a.classid=b.classid
MogDB(#       and a.refclassid=b.refclassid
MogDB(#       and a.refobjid<>b.refobjid
MogDB(#       and pc.oid=a.refobjid     
MogDB(#       and c.oid=b.objid
MogDB(#       and relnamespace in (select oid from pg_namespace where nspname='public') and pc.relname='t1');
 relnamespace | relname | relkind 
--------------+---------+---------
         2200 | a1      | v
(1 row)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2927703/,如需轉載,請註明出處,否則將追究法律責任。

相關文章