暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

磐维数据库集中式2.0版本_查询业务表但实际访问的是系统视图_避坑指引

原创 磐维数据库 2025-10-31
106

背景:

某省侧业务人员反馈他们有张表名为dict的业务表,登录到数据库中select查询这张表,但返回的是系统视图dict的数据。

环境:

版本:panweidb v2.0

架构:集中式,一主两备

数据库兼容模式:A模式

问题现象:

A模式下,业务创建了一张表名为dict的表:

1、执行select * from dict,查询到的是系统视图dict的数据;

2、select 显式带上schema才能查询到名为dict的这张表:select * from sch.dict。

3、业务要求不显式带上schema的情况下,可以访问到实际的业务表dict。

问题分析:

此问题系默认搜索路径优先级的问题

1、系统模式pg_catalog,隐式排在默认系统搜索路径的第一顺位

执行show search_path查询到的是显式的结果,pg_catalog实际实在搜索路径优先级的第一顺位。

2、执行select * from dict,会从第一顺位的模式中先查找,如果有这张表,便向客户端返回结果。

3、如果select的时候不显式带上schema的名称,那么需要通过修改搜索路径优先级,将pg_catalog模式的优先级放到最后。

本地环境复现:

  1. 查询数据库兼容模式

2、创建测试表,表名为dict,并生成测试数据

3、执行select * from dict limit 10;可以看到访问的是系统视图pg_catalog.dict的数据

4、修改默认搜索路径优先级,将pg_catalog模式的优先级放在最后,可以看到select * from dict访问到的是tuser1模式中的表

问题结论:

系统模式pg_catalog 默认隐式存在于优先级搜索的第一顺位。业务表同名的dict系统视图,被优先访问到,并返回了系统视图dict的结果。

解决方法:

修改默认搜索路径

1、修改方式1(临时生效):select执行之前,先修改一下默认的搜索路径:set search_path=tuser1,pg_catalog;

2、修改方式2(永久生效):alter user tuser1 SET search_path TO tuser1,pg_catalog;

问题总结:

修改默认搜索路径优先级时,需注意:

1、执行alter user需具备用户管理员权限,修改之后,需重连数据库才能生效

2、生产环境中建议在SQL语句中显式指定schema(如 schema.table),避免因 search_path配置差异导致歧义

3、若多个schema存在同名对象,系统按搜索路径顺序返回首个匹配项,可能引发非预期结果

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论