mysql菜鸟教程
17.3 权限回收:REVOKE语句
在上一节中,我们学习了如何使用 GRANT 授予用户权限。然而,权限管理是一个动态的过程——当用户职责变更、项目结束或安全策略调整时,我们需要收回已授予的权限。REVOKE 语句正是用于撤销用户的权限。
一、REVOKE 的作用
REVOKE 语句与 GRANT 相反,它用于删除用户账户上的某些权限。这些权限可以是从全局级别、数据库级别、表级别等授予的。回收权限后,用户将无法再执行被撤销的操作。
二、REVOKE 的基本语法
REVOKE 权限1 [, 权限2] ... ON 权限级别 FROM '用户名'@'主机名';
权限级别的写法与 GRANT 完全相同:
*.*:全局权限
数据库名.*:数据库权限
数据库名.表名:表权限
数据库名.表名(列名):列权限(极少使用)
PROCEDURE 数据库名.过程名:存储过程权限
FUNCTION 数据库名.函数名:函数权限
回收 GRANT OPTION
如果用户被授予了 WITH GRANT OPTION(允许他们转授权限),你可以单独回收该能力,而保留其他权限:
REVOKE GRANT OPTION ON 权限级别 FROM '用户名'@'主机名';
也可以一并回收权限和转授权限,使用:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM '用户名'@'主机名';
基础示例
假设我们有一个用户 'zhangsan'@'localhost',之前被授予了以下权限:
-- 授予全局查询权限 GRANT SELECT ON *.* TO 'zhangsan'@'localhost'; -- 授予 school 数据库的所有权限 GRANT ALL PRIVILEGES ON school.* TO 'zhangsan'@'localhost'; -- 授予 school.students 表的插入、更新权限 GRANT INSERT, UPDATE ON school.students TO 'zhangsan'@'localhost'; -- 并且允许他将 school 库的 SELECT 权限转授给他人 GRANT SELECT ON school.* TO 'zhangsan'@'localhost' WITH GRANT OPTION;
1. 回收全局查询权限
REVOKE SELECT ON *.* FROM 'zhangsan'@'localhost';
执行后,zhangsan 将无法再查询其他数据库,但 school 库的权限仍然保留。
2. 回收数据库级别的部分权限
假设我们只想收回 school 数据库的 CREATE 和 DROP 权限(但保留其他权限)。注意:之前授予的是 ALL PRIVILEGES,但 REVOKE 需要明确指定要收回的权限。不能直接收回一部分而不收回整个 ALL。你可以单独回收某些权限:
REVOKE CREATE, DROP ON school.* FROM 'zhangsan'@'localhost';
此时,zhangsan 在 school 库上仍然拥有 ALL 中除去 CREATE、DROP 的其他权限(如 SELECT、INSERT 等)。
3. 回收表级别的权限
REVOKE INSERT, UPDATE ON school.students FROM 'zhangsan'@'localhost';
4. 回收 GRANT OPTION
仅收回用户转授 school 库 SELECT 权限的能力,但保留他自己查询 school 库的权限:
REVOKE GRANT OPTION ON school.* FROM 'zhangsan'@'localhost';
5. 完全回收所有权限(包括 GRANT OPTION)
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'zhangsan'@'localhost';
这条语句将删除该用户所有已授予的权限,但用户账户本身仍然存在。之后用户只能登录,无法执行任何操作。
三、注意事项
必须拥有相应权限:要执行 REVOKE,你自身必须拥有要回收的权限(或拥有 GRANT OPTION 且权限范围包含被回收的权限)。通常由 root 或拥有 CREATE USER 权限的管理员操作。
权限回收立即生效:执行 REVOKE 后,用户已建立的连接可能不会立即受影响(某些权限需要重新连接才能生效),但新建立的连接将应用新的权限设置。
ALL PRIVILEGES 不包含 GRANT OPTION:如果用户有 WITH GRANT OPTION,需要单独用 REVOKE GRANT OPTION 回收。
不要忘记主机名:回收权限时必须指定完全匹配的用户名和主机名,否则可能影响错误用户。
如果用户不存在,会报错:MySQL 8.0 开始支持 IF EXISTS 吗?REVOKE 语句本身不支持 IF EXISTS,但可以先用 SHOW GRANTS 检查。
权限叠加的撤销:如果用户从不同级别获得了同一权限(例如全局 SELECT 和数据库 SELECT),撤销全局级别的 SELECT 后,数据库级别的 SELECT 可能仍然存在。权限系统是累加的,撤销某级别的权限不会影响其他级别的相同权限。
谨慎操作:回收权限可能导致应用程序突然无法访问数据库,应在维护窗口执行并充分测试。
四、查看权限变更
回收权限后,可以通过以下命令确认:
SHOW GRANTS FOR 'zhangsan'@'localhost';
输出将显示当前用户剩余的权限。
五、与 GRANT 的对应关系
六、综合实战
假设我们需要调整一个应用账号 'app_user'@'192.168.1.%' 的权限,原来它对 appdb 有所有权限,现在我们希望它只保留读取和写入数据(SELECT, INSERT, UPDATE, DELETE),不再允许修改表结构(CREATE, DROP, ALTER)。
-- 查看当前权限 SHOW GRANTS FOR 'app_user'@'192.168.1.%'; -- 回收所有权限(但不删除账户) REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app_user'@'192.168.1.%'; -- 重新授予所需的权限 GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app_user'@'192.168.1.%'; -- 确认新权限 SHOW GRANTS FOR 'app_user'@'192.168.1.%';
总结
REVOKE 用于从用户账户收回已授予的权限。
语法与 GRANT 类似,但使用 FROM 子句指定用户。
可以回收单个权限、多个权限,或使用 ALL PRIVILEGES 回收所有权限。
GRANT OPTION 需单独回收。
回收权限后,最好用 SHOW GRANTS 验证。
通过 GRANT 和 REVOKE,你可以灵活地控制数据库的访问权限,确保数据安全。

发表评论
所有评论