如何在Redshift中识别视图间依赖关系?解决级联删除问题
在Redshift中识别普通视图间的依赖关系
Redshift提供了系统视图可以帮你快速梳理普通视图之间的依赖关系,以下是两种实用方法:
1. 使用SVV_DEPENDENCIES系统视图
这是最直接的方式,该视图记录了所有数据库对象(包括普通视图、表、物化视图等)之间的依赖关系。你可以通过过滤对象类型,精准获取视图间的依赖链。
查询依赖指定视图的所有视图
比如要查找public schema下view_a被哪些视图依赖:
SELECT DISTINCT dependent_ns.nspname AS 依赖视图所属schema, dependent_obj.relname AS 依赖视图名称, referenced_ns.nspname AS 被依赖视图所属schema, referenced_obj.relname AS 被依赖视图名称 FROM svv_dependencies JOIN pg_class dependent_obj ON svv_dependencies.dependent_id = dependent_obj.oid JOIN pg_namespace dependent_ns ON dependent_obj.relnamespace = dependent_ns.oid JOIN pg_class referenced_obj ON svv_dependencies.referenced_id = referenced_obj.oid JOIN pg_namespace referenced_ns ON referenced_obj.relnamespace = referenced_ns.oid WHERE referenced_ns.nspname = 'public' AND referenced_obj.relname = 'view_a' AND dependent_obj.relkind = 'v' -- 只筛选视图类型的依赖对象 AND referenced_obj.relkind = 'v'; -- 只筛选被依赖的对象是视图
查询指定视图依赖的所有视图
比如要查找public schema下view_b依赖的所有视图:
SELECT DISTINCT referenced_ns.nspname AS 被依赖视图所属schema, referenced_obj.relname AS 被依赖视图名称, dependent_ns.nspname AS 依赖视图所属schema, dependent_obj.relname AS 依赖视图名称 FROM svv_dependencies JOIN pg_class dependent_obj ON svv_dependencies.dependent_id = dependent_obj.oid JOIN pg_namespace dependent_ns ON dependent_obj.relnamespace = dependent_ns.oid JOIN pg_class referenced_obj ON svv_dependencies.referenced_id = referenced_obj.oid JOIN pg_namespace referenced_ns ON referenced_obj.relnamespace = referenced_ns.oid WHERE dependent_ns.nspname = 'public' AND dependent_obj.relname = 'view_b' AND dependent_obj.relkind = 'v' AND referenced_obj.relkind = 'v';
2. 查看视图定义
如果只是想快速确认单个视图的依赖对象,可以直接查询视图的创建语句,从中提取被引用的视图:
SELECT pg_get_viewdef('public.view_c'::regclass);
执行后会返回该视图的SQL定义,你可以直接从中看到它引用了哪些其他视图或表。
注意:使用
SVV_DEPENDENCIES需要具备相应的权限(比如超级用户权限,或被授予该视图的SELECT权限)。
内容的提问来源于stack exchange,提问作者AIViz
相关产品推荐
相关产品推荐

