В postgres получить имя и схему отношений, от которых зависит материализованное представление

Я хочу напечатать схему и имя отношений, от которых зависят все материализованные представления в схеме:

select c.relname, d.classid, d.objid,
  pg_describe_object(
    d.classid, d.objid, d.objsubid)
from pg_class c
  join pg_namespace n on c.relnamespace = n.oid
  left join pg_depend d on c.oid = d.objid
where n.nspname = 'direct' and d.deptype = 'n'

Это дает что-то вроде:

        relname         | relname | classid | objid |                pg_describe_object                 
------------------------+---------+---------+-------+---------------------------------------------------
 cases                  |         |    2618 | 33736 | rule _RETURN on materialized view case_categories
 benefit_investigations |         |    2618 | 33928 | rule _RETURN on materialized view bi_intervals

Возвращенное описание дает некоторую подсказку, но не содержит схему отношения. Как получить фактическую схему и имя зависимости? [NB я использую postgres 9.6]

2 ответа

Решение

Ну вот:

SELECT DISTINCT view_cs.nspname, view_c.relname, tab_cs.nspname, tab_c.relname
FROM pg_depend view_d
JOIN pg_class view_c ON view_c.oid = view_d.refobjid AND view_c.relkind = 'm'
JOIN pg_type view_ct ON view_ct.oid = view_c.reltype
JOIN pg_namespace view_cs ON view_cs.oid = view_ct.typnamespace
JOIN pg_depend tab_d ON tab_d.objid = view_d.objid
JOIN pg_class tab_c ON tab_c.oid = tab_d.refobjid AND tab_c.relkind = 'r'
JOIN pg_type tab_ct ON tab_ct.oid = tab_c.reltype
JOIN pg_namespace tab_cs ON tab_cs.oid = tab_ct.typnamespace
WHERE view_d.deptype = 'n'

Хитрость в том, что вы должны JOIN pg_depend дважды - один раз для отношения правила представления и один раз для отношения таблицы правила.

Добавлять

      AND view_c.relname != tab_c.relname

к утверждению WHERE принятого ответа @Boris, чтобы не показывать зависимость таблицы от самой себя

Другие вопросы по тегам