Navicat权限面板本质是图形化封装GRANT语句,右键表设权限易误配为数据库级授权;正确做法是通过「用户→权限」Tab精确授予单表SELECT等权限,并注意MySQL 8.0+认证插件兼容性问题。
在Navicat权限面板里配 GRANT,本质是生成并执行SQL
navicat 的「权限」选项卡不是魔法面板,它只是图形化封装了 grant 语句。你每勾一个复选框、选一个表、点一次「添加权限」,navicat 就在后台拼一条 grant 命令,并在点击「保存」时批量执行。这意味着:权限生效与否,不取决于界面是否“看起来已保存”,而取决于这些 grant 是否真正被 mysql 服务器接受并写入 mysql.tables_priv 或 mysql.db 系统表。
为什么右键表 →「设置权限」常常配不准
这个快捷入口只支持对**当前连接用户**(即你登录 Navicat 用的账号)操作目标表的权限——但它默认走的是「数据库级」或「全局级」授权路径,无法精确落到单个表的 SELECT / INSERT 组合上。常见问题包括:
- 你右键
orders表点「设置权限」,却给整个sales_db数据库授了SELECT,导致用户能查customers表 - 界面没提供列级控制,但你误以为勾了「SELECT」就等于只读——其实如果同时有
UPDATE或DELETE权限,还是可写 - 该操作不会自动刷新权限缓存,有时需手动执行
FLUSH PRIVILEGES(尤其在旧版 MySQL 或权限刚创建后)
真正可控的表级只读配置,得进「用户」→「权限」Tab
这才是面向第三方用户的正确起点。操作逻辑是:先有用户,再按需授权,而非从表反推。关键步骤如下:
- 在 Navicat 左侧导航栏点击「用户」→「新建用户」,填好
username和host(别用%,优先填对方固定 IP 段如203.0.113.0/24) - 切到「权限」Tab,展开目标数据库(如
analytics_db),**不要点最顶上的「localhost」或「%」行**——那会触发全局授权 - 找到具体表(如
sales_summary),在对应行右侧只勾选SELECT;若还需看视图,额外勾SHOW VIEW - 检查「SQL 预览」Tab,确认生成的语句形如:
GRANT SELECT ON `analytics_db`.`sales_summary` TO 'reporter'@'203.0.113.%'; - 点击「保存」——此时 Navicat 才真正向 MySQL 发送
GRANT并调用FLUSH PRIVILEGES
容易被忽略的兼容性细节
MySQL 8.0+ 默认启用 caching_sha2_password 认证插件,而部分老版本 Navicat(v15 及更早)可能无法正确处理该插件下的权限继承逻辑,导致「明明勾了 SELECT 却报 Access denied」。解决方法只有两个:
- 在创建用户时,「高级」Tab 中手动指定认证插件为
mysql_native_password - 或改用命令行补授权:
GRANT SELECT ON analytics_db.sales_summary TO 'reporter'@'203.0.113.%'; FLUSH PRIVILEGES;,绕过 Navicat 的中间层
表级权限的粒度很细,但代价是 MySQL 会在每次查询前多查一次 mysql.tables_priv 表——如果授权表太多,会影响高并发下的权限校验性能。所以,别为了“看起来精细”就给 50 张表逐个配 SELECT,该合并到数据库级的就合并。











