PostgreSQL 9.3 has brought very good new feature – materialized views. But – as usual with PostgreSQL – some other parts are not fully adjusted. So if you need to find objects which depend on some materialized view you cannot use information_schema objects. But you must dig into pg_depend data – this object is so incredibly clever that it is really hard to use it. I have found this really good select (http://codereview.stackexchange.com/questions/23181/get-all-recursive-dependencies-of-a-single-database-object) which shows you all dependencies and I made some small changes.

1. Changed version gives you definitions and drop text which you can use for dropping and recreating of all objects

2. Changed version works for more objects than just one.


WITH RECURSIVE dep_recursive AS (
SELECT
0 AS "level",
object_name AS "dep_name",
'' AS "dep_table",
'' AS "dep_type",
'' AS "ref_name",
'' AS "ref_type"
from (with srcdata as (
select c.oid::regclass::text as object_name, c.relkind as object_kind, ns.nspname as object_schema
from pg_class c
join pg_namespace ns on c.relnamespace=ns.oid
where relkind in ('v','m','r','f') ----views, matvies, regular tables, foreign tables
)
select object_name from srcdata where object_schema like '...here_your_schema...'
) src0
UNION ALL
SELECT
level + 1 AS "level",
depedencies.dep_name,
depedencies.dep_table,
depedencies.dep_type,
depedencies.ref_name,
depedencies.ref_type
FROM (
WITH classType AS (
SELECT
oid,
CASE relkind
WHEN 'r' THEN 'TABLE'::text
WHEN 'i' THEN 'INDEX'::text
WHEN 'S' THEN 'SEQUENCE'::text
WHEN 'v' THEN 'VIEW'::text
WHEN 'c' THEN 'TYPE'::text
WHEN 't' THEN 'TABLE'::text
when 'm' then 'MATERIALIZED VIEW'::text
END AS "type"
FROM pg_class
)
SELECT DISTINCT
CASE classid
WHEN 'pg_class'::regclass THEN objid::regclass::text
WHEN 'pg_type'::regclass THEN objid::regtype::text
WHEN 'pg_proc'::regclass THEN objid::regprocedure::text
WHEN 'pg_constraint'::regclass THEN (SELECT conname FROM pg_constraint WHERE OID = objid)
WHEN 'pg_attrdef'::regclass THEN 'default'
WHEN 'pg_rewrite'::regclass THEN (SELECT ev_class::regclass::text FROM pg_rewrite WHERE OID = objid)
WHEN 'pg_trigger'::regclass THEN (SELECT tgname FROM pg_trigger WHERE OID = objid)
ELSE objid::text
END AS "dep_name",
CASE classid
WHEN 'pg_constraint'::regclass THEN (SELECT conrelid::regclass::text FROM pg_constraint WHERE OID = objid)
WHEN 'pg_attrdef'::regclass THEN (SELECT adrelid::regclass::text FROM pg_attrdef WHERE OID = objid)
WHEN 'pg_trigger'::regclass THEN (SELECT tgrelid::regclass::text FROM pg_trigger WHERE OID = objid)
ELSE ''
END AS "dep_table",
CASE classid
WHEN 'pg_class'::regclass THEN (SELECT TYPE FROM classType WHERE OID = objid)
WHEN 'pg_type'::regclass THEN 'TYPE'
WHEN 'pg_proc'::regclass THEN 'FUNCTION'
WHEN 'pg_constraint'::regclass THEN 'TABLE CONSTRAINT'
WHEN 'pg_attrdef'::regclass THEN 'TABLE DEFAULT'
WHEN 'pg_rewrite'::regclass THEN (SELECT TYPE FROM classType WHERE OID = (SELECT ev_class FROM pg_rewrite WHERE OID = objid))
WHEN 'pg_trigger'::regclass THEN 'TRIGGER'
ELSE objid::text
END AS "dep_type",
CASE refclassid
WHEN 'pg_class'::regclass THEN refobjid::regclass::text
WHEN 'pg_type'::regclass THEN refobjid::regtype::text
WHEN 'pg_proc'::regclass THEN refobjid::regprocedure::text
ELSE refobjid::text
END AS "ref_name",
CASE refclassid
WHEN 'pg_class'::regclass THEN (SELECT TYPE FROM classType WHERE OID = refobjid)
WHEN 'pg_type'::regclass THEN 'TYPE'
WHEN 'pg_proc'::regclass THEN 'FUNCTION'
ELSE refobjid::text
END AS "ref_type",
CASE deptype
WHEN 'n' THEN 'normal'
WHEN 'a' THEN 'automatic'
WHEN 'i' THEN 'internal'
WHEN 'e' THEN 'extension'
WHEN 'p' THEN 'pinned'
END AS "dependency type"
FROM pg_catalog.pg_depend
WHERE deptype = 'n'
AND refclassid NOT IN (2615, 2612)
) depedencies
JOIN dep_recursive ON (depedencies.ref_name like dep_recursive.dep_name)
WHERE depedencies.ref_name NOT IN(depedencies.dep_name, depedencies.dep_table)
)
SELECT
MAX(level) AS "level",
dep_name,
case when min(dep_type)='VIEW' then
'create or replace '||min(dep_type)||' '||dep_name||' as '||
(select definition from pg_views v where v.schemaname||'.'||v.viewname=dep_name)
when min(dep_type)='MATERIALIZED VIEW' then
'create '||min(dep_type)||' '||dep_name||' as '||
(select definition from pg_matviews v where v.schemaname||'.'||v.matviewname=dep_name)
else null end as dep_source_code,
'DROP '||min(dep_type)||' IF EXISTS '||dep_name||';' as drop_dep_text,
min(ref_name) as ref_name,
min(ref_type) as ref_type
FROM dep_recursive d
WHERE level > 0
GROUP BY dep_name