必须用revoke create user on . from 'dev'@'%';,省略on .或写错范围均报错;该权限为全局系统权限,撤销需高权限账号操作,且须同步收回grant option以防权限复原。

必须用 REVOKE CREATE USER ON *.*,不能省略 ON *.*,也不能写成 ON mysql.* 或其他范围——否则语法报错或权限未实际撤销。
CREATE USER 权限只能在全局级别撤销
MySQL 把 CREATE USER 视为全局权限(system privilege),它不作用于库、表或函数,只控制能否执行 CREATE USER、DROP USER、RENAME USER 等账户管理语句。因此:
-
REVOKE CREATE USER FROM 'dev'@'%'会报错:ERROR 1227 (42501): Access denied; you need (at least one of) the CREATE USER privilege(s)—— 因为缺少ON *.* -
REVOKE CREATE USER ON mysql.* FROM 'dev'@'%'语法错误:ERROR 1064 (42000): You have an error in your SQL syntax - 正确写法只有一种:
REVOKE CREATE USER ON *.* FROM 'dev'@'%'
执行前必须确认你有足够权限
撤销 CREATE USER 权限本身需要更高权限——当前账号至少得拥有 CREATE USER 全局权限,或者对 mysql 系统库有 UPDATE 权限。否则命令直接失败:
- 检查自己权限:
SHOW GRANTS FOR CURRENT_USER;,看输出里是否有GRANT CREATE USER ON *.* - 如果没有,别硬试;换
root或 DBA 账号操作 - 注意:
SELECT或INSERT权限完全不够,哪怕你有ALL PRIVILEGES ON *.*,也不代表能撤别人CREATE USER
撤销后要验证,且旧连接仍保留原权限
REVOKE 执行成功不代表立即生效,尤其对已建立的连接:
- 立刻验证:
SHOW GRANTS FOR 'dev'@'%';,确认输出中已无CREATE USER字样 - 如果该用户当前有活跃连接,那些连接仍能执行
CREATE USER,直到断开重连 - 不需要也不建议执行
FLUSH PRIVILEGES——MySQL 8.0+ 自动刷新缓存,它只在直改mysql.user表时才必要 - 如需强制限制,可 kill 对应连接:
KILL CONNECTION [id];,再让应用重连
最常被忽略的是:开发账号往往还挂着 GRANT OPTION,即使收回了 CREATE USER,只要没撤掉 GRANT OPTION,他依然能给自己或其他人加回这个权限。所以收权动作最好连带做:REVOKE GRANT OPTION ON *.* FROM 'dev'@'%'。











