GRANT OPTION 是控制权限转授的开关,拥有者可将已获权限授予他人,但不赋予数据操作能力;必须显式用 WITH GRANT OPTION 授予,且仅作用于语句中列出的权限。

GRANT OPTION 是什么,它能做什么
GRANT OPTION 不是普通权限,而是一个「授权开关」:拥有它的用户,才能把已拥有的权限再授予其他用户。它本身不赋予任何数据操作能力(比如查表、删库),只控制「能不能转授」。没有它,GRANT 语句会报错 ERROR 1045 (28000): Access denied 或更具体的 ERROR 1227 (42000): Access denied; you need (at least one of) the GRANT OPTION privilege(s) for this operation。
如何正确授予带 GRANT OPTION 的权限
必须显式在 GRANT 语句末尾加上 WITH GRANT OPTION,缺一不可。仅执行 GRANT SELECT ON db.* TO 'u'@'%' 不会自动附带委托权。
GRANT SELECT, INSERT ON myapp.* TO 'dev_team'@'10.0.0.%' WITH GRANT OPTION;
-
WITH GRANT OPTION只作用于当前语句中列出的权限(本例是SELECT和INSERT),不能用来转授其他未声明的权限 - 不能对角色(role)单独授予
GRANT OPTION,MySQL 8.0+ 中角色本身不持有该选项,必须由被赋予权限的用户账户直接获得 - 如果目标用户已存在但无
GRANT OPTION,需先REVOKE再GRANT ... WITH GRANT OPTION,MySQL 不支持「追加」该选项
撤销 GRANT OPTION 时的常见误区
很多人以为 REVOKE 某个权限就会连带收回委托权,其实不是:只要没显式撤销 GRANT OPTION,它就一直存在。真正有效的方式只有两种:
- 用
REVOKE ... FROM user撤销全部对应权限(包括隐含的委托权) - 或执行
REVOKE GRANT OPTION ON db.* FROM 'u'@'%'—— 注意语法:MySQL 8.0.16+ 才支持这种细粒度撤销;低版本只能靠全量回收 - 撤销后,该用户之前转授出去的权限**不会自动失效**,但其后续新授权行为会被拒绝
为什么 root 用户有时也报 GRANT OPTION 权限不足
这通常是因为 root 账户被创建时指定了 host 限制,例如 'root'@'localhost',而你正从远程连接(如 'root'@'192.168.1.100')。这两个是不同用户,权限不共享。
- 检查实际登录用户:
SELECT USER(), CURRENT_USER();—— 前者是客户端声明的身份,后者才是 MySQL 实际认证的账户 - 确认该账户是否真有
GRANT OPTION:SHOW GRANTS FOR 'root'@'192.168.1.100'; - 若缺失,需用更高权限账户(如
'root'@'localhost')补上:GRANT GRANT OPTION ON *.* TO 'root'@'192.168.1.100' WITH GRANT OPTION;
委托权限链越长,审计和回收越困难;生产环境应避免多层转授,尤其是跨部门或临时账号。










