最稳妥方式是让同事用专用只读账号新建连接,因DBeaver连接配置不加密存密码,且“只读”依赖数据库账号权限而非客户端设置;导出的.json文件明文含password、无权限信息、跨环境失效,且缺少SSL证书等关键依赖。

直接给同事分享一个只读连接,最稳妥的方式不是导出连接配置文件,而是让对方用你配好的只读账号新建连接——因为 DBeaver 的连接配置本身不加密保存密码,且“只读”逻辑不在客户端,而在数据库账号权限上。
为什么不能直接发 .dbeaver-data-sources.json 文件
这个文件里明文存着 password 字段(即使勾选了“保存密码”,也只是用本地密钥简单加密,换台机器或重装系统就打不开);更重要的是,它不包含数据库侧的权限信息。你本地连得上只读库,不代表别人用同一份配置连过去也是只读——如果账号本身有写权限,或者连接时没强制限制模式,照样能执行 UPDATE 或 DROP。
- 导出的 JSON 里没有 SQL 层面的
SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY这类会话级控制 - 不同版本 DBeaver 对连接参数的解析略有差异,比如老版本不识别
readOnly=true在 URL 里的写法 - 如果连接用了自定义驱动路径(比如指向你本机某个
ojdbc8.jar),对方目录不存在就会报Driver not found
正确配置只读账号的三步实操
核心原则:权限在库中设,连接在客户端配,分享靠文档+账号。
- 先让 DBA 或你自己在目标库中创建专用只读账号,例如 MySQL 执行:
CREATE USER 'ro_app'@'%' IDENTIFIED BY 'xxx'; GRANT SELECT ON `mydb`.* TO 'ro_app'@'%'; FLUSH PRIVILEGES;
- 在 DBeaver 中新建连接时,填入该账号,**不要勾选“保存密码”**(避免配置文件泄漏);在连接编辑页点开
Driver properties标签页,手动加一行:readOnly=true(PostgreSQL 需写readonly=true,大小写敏感) - 额外加固:在
Connection settings → Initialization里,填入初始化 SQL:SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;
(MySQL/PostgreSQL 有效;Oracle 用ALTER SESSION DEFAULT TEMPORARY TABLESPACE temp;无法等效替代,需依赖账号权限)
分享时必须附带的说明项
光发个连接名没用。同事拿到后要能独立复现,以下五项缺一不可:
- 数据库类型与版本(如
PostgreSQL 14.5,不是“pgsql”或“postgres”) - 连接 URL 示例(含端口、数据库名):
jdbc:postgresql://10.20.30.40:5432/myapp?readOnly=true - 账号用户名(如
ro_report),**密码单独走安全渠道传递,绝不写进文档或截图** - 是否需要额外驱动:比如 Oracle 要
ojdbc11.jar,得说明从哪下、放哪(drivers/oracle/目录下) - 关键验证动作:连上后执行
SELECT current_user, session_user;和SHOW transaction_read_only;(PostgreSQL)确认会话已生效
最容易被忽略的一点:某些内网库启用了 SSL 双向认证,此时只读账号还得有对应证书文件(client.p12)和密码,而这个文件不会随连接配置一起导出——必须单独提供,并在 DBeaver 的 SSL 设置页指定路径。漏掉这一项,连接看起来成功,但执行查询时会静默失败或超时。











