REVOKE ROLE_ADMIN ON . 会报错,因为ROLE_ADMIN是动态权限,必须用REVOKE SYSTEM PRIVILEGE ROLE_ADMIN ON .语法;省略SYSTEM PRIVILEGE或写错ON子句均触发ERROR 3724。

必须用 REVOKE SYSTEM PRIVILEGE ROLE_ADMIN ON *.* FROM 'user'@'host',不能混用静态权限语法,也不能省略 SYSTEM PRIVILEGE 关键字。
为什么 REVOKE ROLE_ADMIN ON *.* FROM ... 会报错
MySQL 把 ROLE_ADMIN 归类为动态权限(dynamic privilege),它和 SELECT、INSERT 这类静态权限完全隔离。直接写 REVOKE ROLE_ADMIN 会被当成在撤销一个普通权限名,触发 ERROR 3724 (HY000): Cannot revoke dynamic privilege 'ROLE_ADMIN' using old-style REVOKE。
- 动态权限只能通过
REVOKE SYSTEM PRIVILEGE ...语法操作 -
ON *.*是强制要求的——不接受数据库名或表名,写成ON mysql.*会报语法错误 - 角色管理权限本身不依赖角色定义是否存在,只控制用户能否执行
CREATE ROLE、DROP ROLE等语句
收回前先确认用户确实有这个权限
别凭印象操作。执行 SHOW GRANTS FOR 'user'@'host',输出里如果出现独立一行 GRANT ROLE_ADMIN ON *.* TO 'user'@'host',才说明该权限真实存在。
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 如果没看到这行,说明用户本来就没被授予过
ROLE_ADMIN,强行REVOKE会静默失败(返回Query OK,但实际无动作) - 也可以查
information_schema.role_table_grants表,过滤privilege_type = 'ROLE_ADMIN' - 注意:
SHOW GRANTS不显示已激活但未默认设置的角色权限,只反映显式授予的权限
收回后权限不会自动从当前连接消失
执行成功后,服务端权限系统立即更新,但已建立的连接仍保有 ROLE_ADMIN 能力,直到重连或主动丢弃。
- 对当前会话,可执行
SET ROLE NONE;(前提是用户没设默认角色)或断开重连 - 若用户设置了
SET DEFAULT ROLE ALL,则即使收回ROLE_ADMIN,也不会影响其已绑定的角色权限,只是不能再创建/删角色了 - 不需要执行
FLUSH PRIVILEGES—— 它只在直接改系统表时才需要,REVOKE自带缓存刷新
最常被忽略的是:收回 ROLE_ADMIN 后,用户仍可能通过其他动态权限(如 SYSTEM_VARIABLES_ADMIN 或 CLONE_ADMIN)间接影响角色生态,得一并检查;另外,如果该用户是 root 或拥有 GRANT OPTION,还得确认是否有人通过它转授过角色权限——那些不会因收回而自动失效。










