【问题标题】:in postgres, get name & schema of relations on which materialized view depends在 postgres 中,获取具体化视图所依赖的关系的名称和模式
【发布时间】:2018-01-04 03:30:03
【问题描述】:

我希望打印模式中所有物化视图所依赖的关系的模式和名称:

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

返回的描述给出了一些提示,但它不包含关系的模式。如何获得实际的依赖模式和名称? [注意我使用的是 postgres 9.6]

【问题讨论】:

    标签: postgresql postgres-9.6


    【解决方案1】:

    给你:

    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 两次 - 一次用于查看规则关系,一次用于规则表关系。

    【讨论】:

      【解决方案2】:

      添加

      AND view_c.relname != tab_c.relname
      

      @Boris 接受的答案的 WHERE 语句以避免显示表对自身的依赖性

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-19
        • 2014-06-24
        • 2016-10-20
        • 2015-12-28
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        相关资源
        最近更新 更多