Navicat SQL编辑器无“只读模式”开关,防误操作须依赖会话层约束:设AUTOCOMMIT=0+SQL_SAFE_UPDATES=1,并在数据库侧创建仅含SELECT权限且限定IP的账号,显式回收所有写权限。

Navicat SQL编辑器本身没有“只读模式”开关
Navicat 的 SQL 编辑器不提供界面级的「只读编辑器」设置——你无法通过勾选某个选项让编辑器禁止输入或禁用执行按钮。所谓“防误操作”,必须靠会话层和数据库层的硬性约束,而非编辑器 UI 锁定。
真正起效的只读防护是关闭自动提交 + 强制事务
这是最直接、最可控、且 Navicat 原生支持的防误删/误改手段。它不依赖用户自觉,而是让每条 UPDATE、DELETE 都卡在未提交状态,给你二次确认机会。
- 每次连接生产库后,在 SQL 编辑器中第一件事执行:
SET AUTOCOMMIT = 0; - 紧接着加一句:
SET SQL_SAFE_UPDATES = 1;(MySQL 专用,拦截无WHERE或非索引条件的 DML) - 执行 DML 前,先跑一遍
SELECT COUNT(*)验证影响范围 - 执行后立刻看底部状态栏 “Affected rows”,再决定
COMMIT还是ROLLBACK -
SET AUTOCOMMIT = 0只对当前标签页会话有效;切换标签页、重连、或新开窗口都需重新执行
为什么不能依赖 Navicat 的“只读连接”勾选项?
连接属性里勾选的 Read Only 仅影响 Navicat 自身的 DDL 操作(如“设计表”菜单灰显),它完全不拦截你在 SQL 编辑器里手写的 DELETE FROM users; ——只要数据库账号有权限,这条语句照常执行并立即生效(如果 AUTOCOMMIT=1)。
更关键的是:这个勾选项在 Navicat Cloud Team Viewer 角色下依然可被用户自行取消;它不是权限策略,只是个本地 UI 提示开关。
最终只读效果取决于数据库账号权限,不是 Navicat 设置
如果你希望某人“绝对不能删改”,唯一可靠路径是:在数据库侧创建一个只拥有 SELECT 权限的账号,并显式 REVOKE 所有写类权限。例如 MySQL 中:
GRANT SELECT ON mydb.orders TO 'reporter'@'203.0.113.45'; REVOKE INSERT, UPDATE, DELETE, DROP, CREATE, ALTER ON mydb.* FROM 'reporter'@'203.0.113.45'; FLUSH PRIVILEGES;
注意 host 必须填对方真实出口 IP 或可信网段,填 % 就等于放弃控制。Navicat 里的“主机”字段,匹配的是这个 'user'@'host' 中的 host,不是数据库服务器地址。
真正的防护不在编辑器里,而在你执行的每一条 GRANT、每一个 SET、以及是否坚持先查后改的习惯。工具不会替你思考,但可以放大你的谨慎或疏忽。


















