在postgresql、greenplum中,我們經常需要重建某張表,為了方便復原,我們一般將原表rename掉,然後重建原表。
這樣子,就會有一個問題:依賴於原表的視圖還是依賴於rename的表,沒有依賴於新表。這是因為視圖定義的時候是根據表的oid來定義了,原表rename後,oid沒有變,這樣子就導致了視圖依賴錯誤的表。
查詢依賴於某一個表的視圖比較麻煩,要通過pg_depend這個資料字典來查詢,但是用起來很不方便。
下面提供一個視圖,方便查詢依賴於表上的視圖。
1.首先定義一個函數,將oid快速轉換成schemaname.tablename.
CREATE or replace FUNCTION public.tabname_oid(a oid) RETURNS textAS $$ return plpy.execute("select b.nspname||'.'||a.relname as tabname from pg_class a,pg_namespace b wherea.relnamespace=b.oid and a.oid=%s"%(a))[0]['tabname'];$$ LANGUAGE plpythonu;
2.建立查詢檢視
create view public.views_on_tables as select tabname_oid(c.ev_class) viewname,tabname_oid(pc.oid) tablename 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 group by c.ev_class,pc.oid;
3.效果如下: