Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a dependency list for an object in Redshift?

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
like image 607
flybonzai Avatar asked May 09 '17 18:05

flybonzai


People also ask

Are there indexes in Redshift?

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.

How do I resolve the user Cannot be dropped error in Amazon Redshift?

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.

What is late-binding view in Redshift?

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.


1 Answers

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.

like image 147
Rahul Gupta Avatar answered Oct 11 '22 20:10

Rahul Gupta