如何在Redshift中为对象创建依赖项列表?

时间:2017-05-09 18:04:47

标签: sql amazon-redshift

我的团队拥有基于视图构建的视图,因此schema通常会导致灾难和大量的反复试验。

我想要的是一个返回所有依赖对象的查询,这些对象需要在给定某个tableDROP TABLE的情况下以正确的顺序重新创建,以便它们可以自动化并在脚本。我在Redshift 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 文档http://docs.aws.amazon.com/redshift/latest/dg/r_DROP_TABLE.html上使用了依赖项查询的修改版本。

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

{{1}}

1 个答案:

答案 0 :(得分:10)

这对你有用吗?

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;


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