#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;