My team has views built upon views built upon views, so often a DROP TABLE CASCADE
is a recipe for disaster and a lot of trial and error.
What I would like is a query that returns all dependent objects that need to be re-created in the correct order given a certain schema
and table
so that they could be automated and ran in a script. I'm working with a modified version of the dependency query on the Redshift DROP TABLE
documentation http://docs.aws.amazon.com/redshift/latest/dg/r_DROP_TABLE.html.
It seems to be returning views and their dependencies, but not regular tables. I feel like I'm close, what am I missing?
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
It doesn't support indexes – You can't define indexes in Redshift. Instead, each table has a user-specified sort key, which determines how rows are ordered. ** The query planner uses this information to optimize queries.
To resolve these error messages, you must first remove any user permissions. Then, you must transfer object ownership, or remove group ownership of the objects. Important: You must revoke user and group permissions from all databases in the Amazon Redshift cluster.
Late-binding views A late-binding view doesn't check the underlying database objects, such as tables and other views, until the view is queried. As a result, you can alter or drop the underlying objects without dropping and recreating the view. If you drop underlying objects, queries to the late-binding view will fail.
Does this work for you?
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;
If I’ve made a bad assumption please comment and I’ll refocus my answer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With