在phpMyAdmin中确认用户是否有GRANT OPTION,需用root或高权限账号登录,进入「Edit privileges」页面后选择“All databases”,在「Global privileges」区块底部找到并勾选“Grant option”复选框;若该复选框存在且已勾选,则用户拥有GRANT OPTION。
phpMyAdmin里怎么确认用户有GRANT OPTION?
直接看「edit privileges」页面最底部的复选框,不是靠猜、也不是查系统表字段——老版本(4.x)甚至不显示这个选项,除非你用 root 登录且手动展开全局权限区域。
关键点在于:GRANT OPTION 是一种特殊权限,它不会出现在普通权限列表里,也不会被 SHOW GRANTS 单独标出“GRANT OPTION”字样(而是体现在语句末尾的 WITH GRANT OPTION)。所以不能只扫一眼勾选框就下结论。
- 先确保你用的是 root 或已知有
GRANT OPTION的账号登录 phpMyAdmin,否则根本看不到该选项 - 点击右上角用户名 →
Privileges→ 找到目标用户 → 点Edit privileges - 向下滚动到底部,找到「Add privileges on the following databases」区域 → 下拉选
All databases - 此时页面才会出现「Global privileges」区块,里面最下方有一个叫
Grant option的复选框(注意不是「Grant」,是「Grant option」) - 如果这个复选框存在且已勾选,说明该用户拥有
GRANT OPTION;如果灰显/不可点/根本没出现,说明当前账号没权限查看或该用户没被授予
为什么SHOW GRANTS结果里没写GRANT OPTION却实际有?
这是 MySQL 权限模型的常见错觉。只要 SHOW GRANTS FOR 'user'@'host' 返回的任意一条语句末尾带 WITH GRANT OPTION,就表示该用户在对应范围(global / db / table)拥有转授权能力。
但要注意:这条语句可能藏在中间某一行里,比如:
GRANT SELECT, INSERT ON `mydb`.* TO 'app'@'localhost' WITH GRANT OPTION;
而不是第一行。很多人只扫第一行就误判。
立即学习“PHP免费学习笔记(深入)”;
-
WITH GRANT OPTION只对当前GRANT语句生效范围有效,不能跨层级继承(比如 global 的 GRANT OPTION 不自动赋予 db 级权限的转授) - MySQL 8.0+ 中,角色(role)也可能携带
GRANT OPTION,此时SHOW GRANTS会显示AS role_name,需额外查mysql.role_edges确认来源 - 如果执行
SHOW GRANTS报Access denied,不是用户没GRANT OPTION,而是你当前登录账号没权限查mysql.user表
查系统表时该盯哪个字段?
别信 Select_priv 这类字段——GRANT OPTION 在 mysql.user 表里对应的是 Grant_priv 字段,值为 Y 或 N(注意大小写敏感,且 MySQL 8.0+ 还要结合 mysql.role_edges 判断角色继承)。
- 运行:
SELECT User, Host, Grant_priv FROM mysql.user WHERE User = 'your_user' AND Host = 'localhost'; - 返回结果中
Grant_priv = 'Y'才算真正拥有全局级GRANT OPTION - 但仅靠这个字段不够:如果用户是通过角色获得的
GRANT OPTION(MySQL 8.0+),Grant_priv仍为N,必须查information_schema.role_table_grants或mysql.role_edges - MariaDB 10.4+ 启用
skip-grant-tables时,所有字段都不可信,整个权限系统失效
容易忽略的兼容性坑
phpMyAdmin 版本和 MySQL/MariaDB 版本不匹配时,Grant_priv 字段可能压根不显示,或者界面把 Grant option 复选框藏在折叠区域里,连滚动条都懒得提示。
- phpMyAdmin 4.0–4.2:必须手动选
All databases才能触发Grant option显示,否则它就躺在页面最底下当页脚 - phpMyAdmin 5.2+:默认展开「Global privileges」,但若后端 MySQL 是 5.6 或更低,
Grant_priv字段名可能叫grant_priv(小写),导致界面读取失败 - 某些宝塔集成版删掉了
Privileges菜单项,只能靠SHOW GRANTS或直接查mysql.user - 主机名不匹配是最隐蔽的问题:
'user'@'localhost'和'user'@'127.0.0.1'的Grant_priv是分开存的,改了一个另一个不受影响
真正的难点不在怎么查,而在于你永远不确定看到的权限状态是否已刷新——改完必须点右上角 Reload privilege tables,或手动执行 FLUSH PRIVILEGES,否则界面上的勾选和系统实际行为是脱节的。



















