REVOKE 必须与 GRANT 完全一致才能撤销权限,包括权限名、ON 范围和 'user'@'host' 三处严格匹配;大小写敏感、粒度一致、GRANT OPTION 和动态权限需单独处理;撤销后需新连接验证,不可依赖旧连接或 FLUSH PRIVILEGES。
撤销特定数据库权限,不是“删掉这个库的访问”,而是“删掉某条 GRANT 记录”。MySQL 不会自动匹配或推导——REVOKE 必须在三处完全对齐:权限名、ON 范围、'user'@'host'。任意一处写错,命令可能静默失败(比如主机名不匹配),或直接报错 ERROR 1141(找不到对应授权)。
SELECT 不能写成 select —— 权限名大小写敏感app_log.* 和 app_log.t1 是不同授权粒度,不能混用;当初授的是表级,就不能用库级去撤'dev'@'10.0.1.%' 写成 'dev'@'%',哪怕用户真实连得进来,REVOKE 也作用在另一个逻辑账号上REVOKE SELECT ON `my-db`.* FROM 'u'@'h';
想清空一个用户对 report_db 的全部权限,写 REVOKE ALL PRIVILEGES ON report_db.* FROM 'analyst'@'%' 是对的;但如果你当初授权时加了 WITH GRANT OPTION,这条命令不会把它撤掉——必须显式加上:
REVOKE ALL PRIVILEGES, GRANT OPTION ON report_db.* FROM 'analyst'@'%';
另外注意:ALL PRIVILEGES 不包含 GRANT OPTION,也不包含 MySQL 8.0+ 的动态权限(如 BACKUP_ADMIN),这些都得单独 REVOKE。
REVOKE 'reader_role' FROM 'analyst'@'%'),REVOKE 直接授权的部分不影响角色权限ALL PRIVILEGES ON report_db.* 不会撤掉列级权限(如 SELECT(col_a) ON report_db.users),那些得单独处理REVOKE ALL PRIVILEGES ON *.* 试图“一劳永逸”——它会把用户在 mysql、performance_schema 等系统库的权限也干掉,可能导致后续管理异常REVOKE 成功返回 Query OK,不代表应用立刻失去权限。MySQL 权限检查发生在连接建立时,已存在的连接(尤其是连接池里的长连接)仍持有旧权限快照。你看到的“还能 INSERT”,不是命令没执行,而是连接没刷新。
SHOW GRANTS FOR 'analyst'@'%',确认输出里已剔除对应行mysql -u analyst -h db-host -p -e "INSERT INTO report_db.t1 VALUES (1)"
SET ROLE NONE(若启用了角色)FLUSH PRIVILEGES 在 MySQL 8.0+ 中非必需,但加了不报错;真正关键的是让客户端重连,不是刷缓存你以为 SHOW GRANTS 没了就干净了?不一定。细粒度权限(表级、列级、甚至存储过程级)往往存在 mysql.tables_priv、mysql.columns_priv 表中,mysql.db 表查不到。
SELECT * FROM mysql.columns_priv WHERE User='analyst' AND Host='%' AND Db='report_db';
SELECT * FROM mysql.tables_priv WHERE User='analyst' AND Host='%' AND Db='report_db';
DELETE FROM mysql.tables_priv —— 这会破坏权限缓存一致性,且 MySQL 8.0+ 的角色模型会让这类操作失效REVOKE 对应粒度语句,例如:REVOKE SELECT(col_a) ON report_db.users FROM 'analyst'@'%';
真正容易被跳过的,是重连验证这一步——人看到 Query OK 就以为完事了,结果权限变更在生产环境形同虚设。
小米路由器3G怎么恢复出厂设置(小米路由器3G该如何恢复出厂设置)
小米路由器3g和4a千兆版哪个好(小米路由器3g和4a千兆版对比区别)
Sensor Tower:ChatGPT全球份额跌破50%,Gemini与Claude加速追赶
OpenAI提速狂飙16倍!GPT-5.6多智能体V2上线,741轮怪物对话1秒打开
“十五五”时期 煤矿危险繁重岗位将由机器人替代
waytouniverse/ppt-generator:从 Markdown 大纲生成风格统一的 PPT 图片