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

服务器模式下H2数据库TCP连接只读权限限制方法问询

H2 TCP服务器模式全局限制只读的可行方案

方案1:基于数据库用户权限控制(最灵活,推荐)

该方案可以精准控制不同用户的读写权限,不需要调整服务器全局配置,适合同时存在读写和只读访问需求的场景:

  • 首先使用拥有管理员权限的账户连接到H2数据库
  • 执行SQL创建只读用户:
CREATE USER read_only_user PASSWORD '自定义密码';
  • 为该用户授予对应 schema 的只读权限,仅开放查询能力:
-- 授予PUBLIC schema下所有表的查询权限,如有其他schema自行替换
GRANT SELECT ON SCHEMA PUBLIC TO read_only_user;
-- 如果需要仅开放指定表的查询权限,可改为如下写法
-- GRANT SELECT ON TABLE 目标表名 TO read_only_user;
  • 后续所有只读场景的连接统一使用上述创建的只读用户,无论客户端URL是否携带读写参数,该用户都无法执行写入、修改、删除类操作。同时注意保管好原有高权限用户的密码,避免非授权使用。

方案2:H2 TCP服务器启动时配置全局只读(适合全实例只读场景)

如果你的H2实例不需要提供任何写入服务,可以在启动TCP服务器时直接指定只读参数,全局拦截所有写入请求:

  • 启动命令添加 -readOnly 参数即可,示例如下:
java -cp h2*.jar org.h2.tools.Server -tcp -tcpPort 8082 -readOnly
  • 该配置生效后,整个H2实例下的所有数据库都处于只读状态,不管使用什么用户、客户端URL加什么参数,都无法执行写入操作,彻底绕过客户端侧的参数限制。

方案3:数据库文件设置系统级只读(兜底方案)

你也可以直接修改数据库物理文件的系统权限为只读,从操作系统层面拦截写入操作:

  • 首先停止H2服务器,避免正在运行的写入操作损坏文件
  • Linux/macOS下执行权限修改:chmod 444 ~/source/database/database.*
  • Windows下找到对应数据库文件,右键属性勾选「只读」即可
  • 该方案生效后,即使用户权限、服务器配置都允许写入,操作系统也会拒绝写入请求,可作为兜底的只读限制手段。

你之前了解的JDBC URL添加ACCESS_MODE_DATA=r的方式仅为客户端侧的逻辑限制,仅能防止客户端误操作,完全可以通过移除参数绕过,不能作为安全层面的只读控制手段。

内容的提问来源于stack exchange,提问作者learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:06:05