2016-10-24 44 views
2

我有一個視圖取決於一個表:create view hello_v as select * from hello; 要從視圖名稱檢索引用的表名,我認爲pg_class和pg_depend表可能會有用。 截斷表格導致pg_depend中沒有條目。pg_catalog.pg_class.relfilenode截斷後

如何返回等於pg_catalog.relfilenode的pg_depend.refobjid?

我可以重現我的觀點:

select version(); 

create table hello(name text); 
create view hello_v as select * from hello; 

select c.relname, c.relfilenode from pg_catalog.pg_class c inner join pg_catalog.pg_depend d on d.refobjid = c.relfilenode 
    where c.relname in ('hello', 'hello_v') group by relname, relfilenode order by c.relname; 

relname | relfilenode 
---------+------------- 
hello |  305818 
hello_v |  305824 

truncate hello; 

select c.relname, c.relfilenode from pg_catalog.pg_class c inner join pg_catalog.pg_depend d on d.refobjid = c.relfilenode 
    where c.relname in ('hello', 'hello_v') group by relname, relfilenode order by c.relname; 

relname | relfilenode 
---------+------------- 
hello_v |  305824 

-- I hope to exist a record where relname = hello and relfilenode = xxx 

或者乾脆:

create table hello(name text); 

select c.relname, c.relfilenode from pg_catalog.pg_class c inner join pg_catalog.pg_depend d on d.refobjid = c.relfilenode 
    where c.relname = 'hello' group by relname, relfilenode order by c.relname; 

truncate hello; 

select c.relname, c.relfilenode from pg_catalog.pg_class c inner join pg_catalog.pg_depend d on d.refobjid = c.relfilenode 
    where c.relname = 'hello' group by relname, relfilenode order by c.relname; 

感謝。

回答

0

您的連接條件有誤。你想加入c.oid,而不是relfilenode。

這正確地顯示你的表:

select c.relname, c.relfilenode from pg_catalog.pg_class c inner join pg_catalog.pg_depend d on d.refobjid = c.oid 
where c.relname = 'hello' group by relname, relfilenode order by c.relname;