我的团队的观点是建立在观点基础之上的,因此通常DROP TABLE CASCADE是灾难的根源和大量的反复试验。
DROP TABLE CASCADE
我想是一个查询,返回了需要在给予一定按照正确的顺序重新创建的所有依赖的对象schema,并table让他们可以自动化和运行了一个脚本。我正在使用RedshiftDROP TABLE文档http://docs.aws.amazon.com/redshift/latest/dg/r_DROP_TABLE.html上的依赖项查询的修改版本。
schema
table
DROP TABLE
它似乎是在返回视图及其依赖关系,但不是常规表。我感觉自己接近了,我想念什么?
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
这对您有用吗?
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;
如果我做出了错误的假设,请发表评论,然后重新调整我的回答。