人大金仓V9系统表名字冲突,设置search_path不起作用

MySql迁移人大金仓问题

1.数据及结构迁移后,Navicat能查到表和数据,但是启动程序一直报错table xxx not exists 或者column not exists,

一般都是表名和系统表冲突导致的,Kingbase内置了sys_user,sys_config等表
如果业务表跟它同名的话会冲突,默认是去查系统表了,

Kingbase跟MySQL相比多了一层模式的概念,查询一个表时,如果未指定模式,首先会查询跟账号名称同名的模式,
如果不存在,则根据search_path进行搜索

-- 1.未指定模式,先搜索当前用户名相同的模式,如当前账号为test_user,则搜索test_user.sys_user
--   然后根据search_path依次搜索
select * from sys_user

-- 2.直接指定模式查询
select * from 模式.sys_user

2.查看当前search_path

show search_path

3.修改数据库的默认search_path

-- 修改search_path
ALTER DATABASE 数据库 SET search_path TO "$user", 模式, public, sys, sys_catalog, pg_catalog;

-- 重载当前会话配置
SELECT sys_reload_conf();

-- 断开会话连接后验证
SHOW search_path

4.修改模式后仍然启动报错

一般是由于程序中连接参数指定currentSchema导致的,去除即可
image

业务程序中不建议指定模式,具体原因如下
当使用?currentSchema=模式名时, 会覆盖search_path的配置,
同时sys_catalog模式是系统的基础模式,存放了数据库的一些元数据,为了保证所有的对象,脚本,视图,存储过程等都能正常运行,
Kingbase的默认策略,当用户指定的模式不包含sys_catalog时,kingbase会默认将sys_catalog添加到搜索的第一位,
所以最终search_path就变成了sys_catalog, 模式名, 我们在数据库层面配置的search_path就不管用了

posted @ 2026-09-24 15:26  小鱼,  阅读(69)  评论(0)    收藏  举报