PostgreSQL查找表依赖:脚本返回重复视图结果的问题求助
PostgreSQL查找表依赖视图的重复结果解决办法
你的脚本返回重复结果的原因是:每个视图在pg_rewrite系统表中会对应多条记录(通常是2条),关联查询后每个视图会被匹配多次,导致结果翻倍。
解决思路1:给原脚本添加去重
在SELECT后加上DISTINCT关键字即可得到唯一的视图列表,修改后的脚本如下:
SELECT DISTINCT v.oid::regclass AS view FROM pg_depend AS d -- 依赖目标表的对象 JOIN pg_rewrite AS r -- 依赖目标表的规则 ON r.oid = d.objid JOIN pg_class AS v -- 规则对应的视图 ON v.oid = r.ev_class WHERE v.relkind = 'v' -- 仅筛选视图 AND d.classid = 'pg_rewrite'::regclass AND d.refclassid = 'pg_class'::regclass AND d.deptype = 'n' -- 正常依赖关系 AND d.refobjid = 'schema.table'::regclass; -- 替换为你的目标表(schema.表名)
解决思路2:使用更简洁的查询方式
可以跳过pg_rewrite的关联,直接通过pg_depend匹配依赖视图:
SELECT DISTINCT c.oid::regclass AS view FROM pg_depend d JOIN pg_class c ON d.objid = c.oid WHERE c.relkind = 'v' AND d.refclassid = 'pg_class'::regclass AND d.refobjid = 'schema.table'::regclass AND d.deptype = 'n';
思路3:使用information_schema视图(更直观)
如果只需要直接依赖该表的视图,也可以用information_schema中的视图来查询,语法更易懂:
SELECT DISTINCT table_name AS view_name FROM information_schema.view_table_usage WHERE table_schema = 'your_schema' -- 替换为表所在的schema AND table_name = 'your_old_table'; -- 替换为你的旧表名
以上三种方法都能得到不重复的依赖视图列表,你可以根据习惯选择使用。
内容的提问来源于stack exchange,提问作者Haris
相关产品推荐
相关产品推荐

