You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:05:13