MySQL撤销root用户权限失败求助:无法限制建删表操作
解决MySQL root用户权限撤销问题
首先咱们梳理下你操作里的核心问题,这也是导致命令无效和报错的关键:
1. 用户身份不匹配
你用SHOW GRANTS FOR root@localhost;查询的是root@localhost这个用户的权限,但执行撤销命令时写的是root@'%'——在MySQL里,用户是「用户名+主机地址」的组合,这俩是完全独立的账号,所以你之前的撤销命令根本没作用在目标root用户身上。
2. 报错原因
Access denied for user 'root'@'localhost' to database 'myDb'这个错误,是因为你当前登录的是root@localhost,但命令要修改的是root@'%',而这个root@'%'可能本身没有访问myDb的权限,甚至可能不存在,所以MySQL拒绝了这个操作。
正确的操作步骤
如果你想让root@localhost无法在myDb库中创建和删除表,只需要精准撤销该用户在myDb库上的CREATE和DROP权限即可,不用撤销所有权限:
步骤1:针对指定数据库撤销权限
执行以下命令:
REVOKE CREATE, DROP ON myDb.* FROM 'root'@'localhost'; FLUSH PRIVILEGES;
步骤2(可选):全局限制所有数据库
从你的SHOW GRANTS结果来看,root@localhost还拥有%.*的权限(%在这里是通配所有数据库名),如果想让该用户在所有数据库都不能创建/删除表,需要同时撤销全局和%.*范围的权限:
REVOKE CREATE, DROP ON *.* FROM 'root'@'localhost'; REVOKE CREATE, DROP ON `%`.* FROM 'root'@'localhost'; FLUSH PRIVILEGES;
验证权限是否生效
执行以下命令查看权限变化:
SHOW GRANTS FOR 'root'@'localhost';
你会看到CREATE和DROP权限已经从对应范围的权限列表中移除。
补充说明
root用户虽然默认拥有最高权限,但并不是不能被撤销权限,只是必须针对正确的用户身份(用户名+主机)和对应的权限范围(全局、数据库、表级等)操作,才能生效。
内容的提问来源于stack exchange,提问作者Johny Bravo
相关产品推荐
相关产品推荐

