背景:
某省侧业务人员反馈他们有张表名为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模式的优先级放到最后。
本地环境复现:
- 查询数据库兼容模式
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存在同名对象,系统按搜索路径顺序返回首个匹配项,可能引发非预期结果




