Navicat 仅为数据库权限管理的图形化工具,不控制权限;真正起作用的是底层数据库的授权体系,所有权限操作本质是执行GRANT/REVOKE等SQL或调用系统存储过程。
Navicat 本身不管理数据库权限,它只是客户端
navicat 不是权限控制系统,它不存储、不解析、也不下发用户权限策略。你看到的「用户」「角色」「权限」相关界面,只是对底层数据库(mysql / postgresql / sql server 等)权限视图的只读展示或简化操作入口。真正起作用的是你连接的那个数据库实例本身的授权体系。
所以,所谓“在 Navicat 里设置项目成员权限”,本质是:用 Navicat 当作图形化工具,去执行 GRANT、REVOKE、CREATE USER 这类 SQL 命令,或者点选式调用对应数据库的系统存储过程。
- MySQL 场景下,Navicat 调用的是
mysql.user表和GRANT语句 - PostgreSQL 场景下,它操作的是
pg_roles、pg_shdepend和GRANT ON TABLE/SCHEMA - SQL Server 场景下,它背后走的是
sp_addrolemember或ALTER ROLE ... ADD MEMBER
细粒度权限必须绕过 Navicat 的「用户向导」直接写 SQL
Navicat 自带的「新建用户」向导(右键连接 →「用户」→「新建用户」)只支持库级(Database-level)粗粒度授权,比如「允许访问 test_db,拥有 SELECT/INSERT」。但它无法设置:「仅能查 orders 表里的 id 和 created_at 字段」「不能删 users 表中 status = 'archived' 的行」「对 logs 表只能执行 INSERT,且必须通过特定存储过程」——这些都属于行级、列级、动态策略级控制,Navicat GUI 完全不提供入口。
实操建议:
- 关闭「用户向导」,打开查询窗口,手动执行
GRANT SELECT(id, created_at) ON test_db.orders TO 'dev1'@'%'; - 行级限制需依赖数据库原生能力:MySQL 8.0+ 的
CREATE POLICY(配合ROW LEVEL SECURITY)、PostgreSQL 的RLS策略、SQL Server 的SECURITY POLICY - Navicat 可以执行这些语句,但不会帮你生成或校验语法;贴错一个引号或漏掉
WITH GRANT OPTION,权限就失效
团队协作中最大陷阱:权限变更未同步到所有环境
开发人员常在本地 Navicat 连测试库配好权限后,误以为 UAT 或生产环境也自动同步了。实际上,Navicat 不做跨实例权限复制。每个数据库实例的 mysql.user(或等效系统表)是独立维护的。
常见错误现象:
- 开发在测试库给
report_user授了SELECT权限,上线后报表报错Access denied for user 'report_user'@'10.20.30.40' - 用 Navicat 的「导出用户」功能,结果只导出了
CREATE USER语句,漏掉了GRANT部分 - 不同成员用 Navicat 连接同一套数据库,但各自保存的连接配置里用了不同账号(如 root vs app_rw),导致权限感知混乱
可靠做法:
- 把权限 SQL 写进部署脚本(如 Ansible task / Flyway migration / dbt pre-hook),和建表语句一起版本化
- 禁止用 Navicat「保存密码」连生产库;改用跳板机 + SSH 隧道 + 数据库代理账号,统一入口控权
- 定期用
SELECT user, host, authentication_string FROM mysql.user;对比各环境用户状态
Navicat 连接账号 ≠ 应用运行账号,别混淆权限主体
很多团队让后端服务直接复用开发人员在 Navicat 里登录的账号(比如 dev_admin),这是高危操作。Navicat 连接账号是人使用的临时会话身份,而应用账号应是长期、最小权限、可审计的服务账号。
后果很直接:
-
dev_admin拥有DROP TABLE权限,某次上线脚本误执行,删库跑路 - 离职员工 Navicat 仍连着库,其账号没及时回收,留下后门
- 应用日志里记录的全是
dev_admin操作,无法区分是代码行为还是人工干预
正确路径:
- 为每个服务单独建账号,例如
svc_orders_readonly、svc_analytics_writer - Navicat 仅用于 DBA 或运维人员排查问题,日常开发用程序账号连接
- Navicat 中「连接属性 → 高级 → 使用不同的用户登录」可临时切换身份验证,避免混用
GRANT 里,在你漏掉的那条 REVOKE 里,在你忘记清理的测试账号里。









