navicat cloud 的「viewer」角色仅限制编辑项目内文件,不限制连接后的sql执行;真正控制数据操作权限的是mysql/postgresql的grant授权,如grant select on mydb.users to 'user'@'%'。
navicat 里的「viewer」角色根本不限制 sql 执行
设为 viewer 后成员仍能删表、清数据,这不是 bug,是设计使然。navicat cloud 的成员权限只管项目内文件(query、model、连接配置)能否编辑,不管连接建立后执行什么 sql。viewer 意味着不能改保存的 sql 脚本、不能重命名连接、不能拖拽调整字段;但只要连接用的是 root 或 admin 这类高权限账号,双击连接进去手写 delete from orders 照样成功。
真正起作用的权限控制点在数据库服务端:MySQL 或 PostgreSQL 的 GRANT 规则。Cloud 层面不转发、不拦截、不校验任何 SQL 请求。
- 检查当前会话权限:连上后执行
SHOW GRANTS FOR CURRENT_USER - 最小权限示例:
GRANT SELECT, INSERT ON myapp.users TO 'analyst'@'%' - 禁止跨库访问:不要用
myapp.*,而要精确到myapp.users、myapp.logs
跨平台协作时,Navicat 用户权限配置容易漏掉 host 匹配
Windows 上用 Navicat 创建的用户,在 macOS 或 Linux 成员连不上,大概率是 host 字段没对齐。MySQL 的用户是 'user'@'host' 二元组,'dev'@'localhost' 和 'dev'@'%' 是两个完全不同的账号。
常见错误现象:Access denied for user 'dev'@'192.168.1.100',但你在 Navicat 里明明看到用户列表里有 dev —— 实际查 SELECT host, user FROM mysql.user 就会发现它只允许 localhost。
- 开发环境可临时授权:
GRANT SELECT ON *.* TO 'dev'@'%',但生产环境必须限定 IP 段,如'dev'@'10.20.%.%' - Navicat 新建用户时,“主机”字段别留空,默认是
%,但要确认是否符合你的网络策略 - MySQL 8+ 默认认证插件是
caching_sha2_password,旧版 Navicat 可能连不上,需执行:ALTER USER 'dev'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'
自动备份失败,往往不是 Navicat 权限问题,而是 mysqldump 调用链断了
Navicat 的“自动运行”任务本质是调用系统命令(如 mysqldump),它本身不直接连数据库。所以报 Access denied 或写入失败,90% 是底层命令权限或参数问题,不是 Navicat UI 里权限勾选错了。
典型表现:手动在 Navicat 里导出正常,但计划任务一跑就失败;或者 Windows 上“以管理员身份运行”仍失败。
- 密码含特殊字符(
@、$、!)会导致mysqldump解析失败,建议改用--defaults-file方式读取凭据 - 备份路径不能是
C:\Program Files\或C:\Users\XXX\AppData这类受 UAC 保护目录 - 若用 Windows 计划任务触发,勾选“不管用户是否登录都要运行”时,实际以
SYSTEM身份执行,它没有权限访问网络盘或用户个人目录 - 确认
mysqldump在系统 PATH 中,或 Navicat 任务里填绝对路径并验证可执行
共享连接被误改导致全队连错库,比权限失控更隐蔽
Navicat Cloud 共享的连接本质是一段同步 JSON,包含 host、port、username,甚至勾选“保存密码”后的密文。只要任一 Editor 成员修改并保存,所有成员下次打开都会加载错误配置——比如把 prod-db.example.com 改成 test-db.example.com,没人察觉,直到上线出事。
这问题比权限过大更难追溯,因为没日志、没提示、不报错,只是连到了错误实例。
- 生产环境连接务必设为“只读共享”:由 Owner 创建,仅分配
Viewer角色 - 敏感连接(如主库、支付库)禁用“保存密码”,强制每次输入,避免密文被同步出去
- 团队约定:所有连接命名带环境标识,如
mysql-prod-primary、pg-staging-replica,降低误操作概率
跨平台协作中,最危险的不是权限没配够,而是你以为配了、其实没生效;不是功能不会用,而是没意识到 Navicat Cloud 和数据库服务端的权限控制是两层独立系统。











