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 中除去 CREATEDROP 的其他权限(如 SELECTINSERT 等)。

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';

这条语句将删除该用户所有已授予的权限,但用户账户本身仍然存在。之后用户只能登录,无法执行任何操作。

三、注意事项

  1. 必须拥有相应权限:要执行 REVOKE,你自身必须拥有要回收的权限(或拥有 GRANT OPTION 且权限范围包含被回收的权限)。通常由 root 或拥有 CREATE USER 权限的管理员操作。

  2. 权限回收立即生效:执行 REVOKE 后,用户已建立的连接可能不会立即受影响(某些权限需要重新连接才能生效),但新建立的连接将应用新的权限设置。

  3. ALL PRIVILEGES 不包含 GRANT OPTION:如果用户有 WITH GRANT OPTION,需要单独用 REVOKE GRANT OPTION 回收。

  4. 不要忘记主机名:回收权限时必须指定完全匹配的用户名和主机名,否则可能影响错误用户。

  5. 如果用户不存在,会报错:MySQL 8.0 开始支持 IF EXISTS 吗?REVOKE 语句本身不支持 IF EXISTS,但可以先用 SHOW GRANTS 检查。

  6. 权限叠加的撤销:如果用户从不同级别获得了同一权限(例如全局 SELECT 和数据库 SELECT),撤销全局级别的 SELECT 后,数据库级别的 SELECT 可能仍然存在。权限系统是累加的,撤销某级别的权限不会影响其他级别的相同权限。

  7. 谨慎操作:回收权限可能导致应用程序突然无法访问数据库,应在维护窗口执行并充分测试。

四、查看权限变更

回收权限后,可以通过以下命令确认:

SHOW GRANTS FOR 'zhangsan'@'localhost';

输出将显示当前用户剩余的权限。

五、与 GRANT 的对应关系

操作

授予

回收

授予/回收权限

GRANT 权限 ON ... TO ...

REVOKE 权限 ON ... FROM ...

授予/回收转授能力

GRANT ... WITH GRANT OPTION

REVOKE GRANT OPTION ON ... FROM ...

六、综合实战

假设我们需要调整一个应用账号 '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,你可以灵活地控制数据库的访问权限,确保数据安全。


所有评论

关于我 备案号:蜀ICP备2023042032号-1