pg_catalog.pg_class.relfilenode после усечения

#postgresql

#postgresql

Вопрос:

У меня есть представление, зависящее от таблицы: создайте представление hello_v как select * из hello; Чтобы извлечь имя таблицы, на которую ссылается имя представления, я думаю, что таблицы pg_class и pg_depend могут быть полезны. Усечение таблицы приводит к отсутствию записи в pg_depend.

Как вернуть pg_depend.refobjid, который равен pg_catalog.relfilenode?

Я могу воспроизвести свою точку зрения:

 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;
  

Спасибо.

Ответ №1:

ваше условие соединения неверно. Вы хотите присоединиться к 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;