`REVOKE` 语句用于收回之前授予用户的权限,是权限管理中的重要安全措施。

基本语法格式

1. 收回特定权限

REVOKE privilege_type [(column_list)] 
    ON privilege_level 
    FROM user [, user] ...

 2. 收回所有权限

REVOKE ALL PRIVILEGES, GRANT OPTION 
    FROM user [, user] ...

参数说明

 

参数说明示例
privilege_type要收回的权限类型SELECTINSERTUPDATEDELETEALL PRIVILEGES
column_list要收回权限的列名(仅用于列级权限)(name, email)
privilege_level权限作用范围*.*mydb.*mydb.users
user用户名和主机名'testUser'@'localhost'


实用示例

示例 1:收回特定权限

 收回用户的插入权限(所有数据库)

REVOKE INSERT ON *.* FROM 'testUser'@'localhost';

收回用户的删除权限(特定数据库)

REVOKE DELETE ON mydb.* FROM 'app_user'@'%';

收回用户的更新权限(特定表)

REVOKE UPDATE ON mydb.users FROM 'admin'@'localhost';

示例 2:收回多个权限

 同时收回多个权限

REVOKE SELECT, INSERT, UPDATE ON mydb.* 
    FROM 'report_user'@'192.168.1.%';

示例 3:收回列级权限

 收回对特定列的更新权限

REVOKE UPDATE (salary, bonus) ON mydb.employees 
    FROM 'hr_user'@'localhost';

示例 4:收回所有权限

 收回用户的所有权限(但用户仍然存在)

REVOKE ALL PRIVILEGES, GRANT OPTION 
    FROM 'testUser'@'localhost';

示例 5:收回 GRANT 权限

 只收回用户授予他人权限的能力

REVOKE GRANT OPTION ON *.* FROM 'testUser'@'localhost';

权限验证

执行 `REVOKE` 后,使用 `SHOW GRANTS` 验证权限变更:

 查看用户当前权限

SHOW GRANTS FOR 'testUser'@'localhost';

输出示例:

 Grants for testUser@localhost              

 GRANT SELECT ON *.* TO 'testUser'@'localhost'

 

注意事项和最佳实践

1. 权限要求:执行 `REVOKE` 需要:

    `CREATE USER` 权限 或

    `UPDATE` 权限 on `mysql` 数据库

2. 级联回收:如果用户有 `GRANT OPTION` 权限,收回其权限时不会自动收回其已授予他人的权限

3. 权限层级:需要精确匹配权限级别:

    如果权限是授予 mydb.*,必须在此级别收回

   REVOKE SELECT ON mydb.* FROM 'user'@'%';

    而不是

   REVOKE SELECT ON *.* FROM 'user'@'%';

4. 用户仍然存在:`REVOKE` 只移除权限,不删除用户。要完全删除用户:

   DROP USER 'testUser'@'localhost';

 

5. 立即生效:权限收回立即生效,无需重启服务

常见使用场景

 场景 1:安全审计后收紧权限

 发现用户权限过多,收紧到最小必要权限

REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'%';

GRANT SELECT, INSERT ON specific_db.* TO 'user'@'%';

 

场景 2:临时权限回收

 临时禁用用户写权限

REVOKE INSERT, UPDATE, DELETE ON production.* FROM 'app_user'@'%';

 

 维护完成后恢复

GRANT INSERT, UPDATE, DELETE ON production.* TO 'app_user'@'%';

 

场景 3:权限修正

 错误授予了过多权限,进行修正

REVOKE DROP, ALTER ON *.* FROM 'junior_dba'@'localhost';

GRANT SELECT, INSERT, UPDATE ON dev_db.* TO 'junior_dba'@'localhost';

 

错误处理

如果遇到错误,检查以下问题:

1. 权限不存在:尝试收回未授予的权限

2. 用户不存在:指定的用户不存在

3. 权限不足:当前用户没有执行 `REVOKE` 的权限

4. 语法错误:权限级别或用户名格式错误

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)