【问题标题】:How to create a dependency list for an object in Redshift?如何为 Redshift 中的对象创建依赖关系列表?
【发布时间】:2017-10-08 04:25:10
【问题描述】:

我的团队拥有基于视图的视图,因此DROP TABLE CASCADE 通常会导致灾难和大量试错。

我想要的是一个查询,它返回所有需要以正确顺序重新创建的依赖对象,给定特定的schematable,以便它们可以自动化并在脚本中运行。我正在使用 Redshift DROP TABLE 文档 http://docs.aws.amazon.com/redshift/latest/dg/r_DROP_TABLE.html 上的依赖查询的修改版本。

它似乎返回视图及其依赖项,而不是常规表。我觉得我很接近了,我错过了什么?

WITH dependencies AS (
    SELECT DISTINCT
      cls1.oid     AS tbloid,
      nsp1.nspname AS schemaname,
      cls1.relname AS name,
      nsp2.nspname AS refbyschemaname,
      cls2.relname AS refbyname,
      cls2.oid     AS viewoid
    FROM pg_catalog.pg_class cls1
      JOIN pg_catalog.pg_depend dep1
        ON cls1.relfilenode = dep1.refobjid
      JOIN pg_catalog.pg_depend dep2
        ON dep1.objid = dep2.objid
      JOIN pg_catalog.pg_class cls2
        ON dep2.refobjid = cls2.relfilenode
      LEFT OUTER JOIN pg_namespace nsp1
        ON cls1.relnamespace = nsp1.oid
      LEFT OUTER JOIN pg_namespace nsp2
        ON cls2.relnamespace = nsp2.oid
    WHERE dep2.deptype IN ('i' :: "CHAR", 'n' :: "CHAR")
          AND cls2.relkind IN ('v' :: "CHAR", 'r' :: "CHAR")
          AND nsp1.nspname NOT IN ('pg_catalog', 'information_schema')
    ORDER BY 4, 5
),

    joined_to_views AS (
      SELECT
        d.schemaname,
        d.name,
        d.refbyschemaname,
        d.refbyname,
        p.definition
      FROM dependencies d
        LEFT JOIN pg_views p
          ON d.refbyschemaname = p.schemaname AND d.refbyname = p.viewname
  )

SELECT *
FROM joined_to_views

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案1】:

    这对你有用吗?

    SELECT dependent_ns.nspname as dependent_schema
    , dependent_view.relname as dependent_view 
    , source_ns.nspname as source_schema
    , source_table.relname as source_table
    , pg_attribute.attname as column_name
    FROM pg_depend 
    JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid 
    JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid 
    JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid 
    JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid 
        AND pg_depend.refobjsubid = pg_attribute.attnum 
    JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
    JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace
    WHERE 
    source_ns.nspname = 'my_schema'
    AND source_table.relname = 'my_table'
    AND pg_attribute.attnum > 0 
    AND pg_attribute.attname = 'my_column'
    ORDER BY 1,2;
    


    如果我做出了错误的假设,请发表评论,我会重新调整答案。

    【讨论】:

    • 很遗憾,这个查询没有找到相关的物化视图。能更新一下吗?
    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多