H2 2.0 JDBC问题:自定义Users表与系统表冲突,需仅显示PUBLIC schema
解决H2 2.0中自定义表与系统表冲突及仅显示PUBLIC Schema的问题
核心问题原因
H2 2.0对元数据可见性和权限模型做了调整:
USERS成为INFORMATION_SCHEMA的系统表,与你PUBLIC下的自定义表重名导致识别冲突- 即使撤销用户对INFORMATION_SCHEMA的权限,默认情况下
getTables()仍会返回该schema的部分元数据,这是2.0与1.x的行为差异
解决方案
1. 修改JDBC URL强制隐藏INFORMATION_SCHEMA
在JDBC连接URL中添加INFORMATION_SCHEMA=OFF参数,直接禁止元数据查询返回INFORMATION_SCHEMA的表:
jdbc:h2:{$home}/pinf;SCHEMA=PUBLIC;INFORMATION_SCHEMA=OFF
这个参数是H2 2.0新增的,专门用于控制INFORMATION_SCHEMA在元数据接口中的可见性,设置后getTables()只会返回PUBLIC schema下的表。
2. 完善用户权限与默认Schema配置
除了你已有的权限语句,添加默认Schema设置,确保用户登录后默认操作上下文在PUBLIC:
-- 原有的用户创建与权限语句 CREATE USER pinf PASSWORD 'pinf' ADMIN; GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA PUBLIC TO pinf; REVOKE ALL ON SCHEMA INFORMATION_SCHEMA FROM pinf; -- 新增:设置用户默认Schema为PUBLIC ALTER USER pinf SET DEFAULT SCHEMA PUBLIC;
3. 代码层面过滤(可选)
如果无法修改JDBC URL,可以在调用getTables()时指定Schema模式参数为'PUBLIC',精准过滤结果:
// 第三个参数指定Schema模式为PUBLIC,仅返回该Schema的表 ResultSet tables = con.getMetaData().getTables(null, "PUBLIC", null, null);
验证效果
完成上述配置后,以pinf用户登录,调用getTables()时将只会看到PUBLIC schema下的自定义USERS表,不再出现INFORMATION_SCHEMA中的系统表,与H2 1.x的行为一致。
内容的提问来源于stack exchange,提问作者sproketboy
相关产品推荐
相关产品推荐

