# 撤销权限

在本教程中，您将学习如何使用MySQL中的`REVOKE`语句从MySQL帐户中撤销权限。

我们强烈建议您遵循以下教程，以更好地了解MySQL `REVOKE`语句的工作原理：

* [MySQL访问控制系统入门](http://www.yiibai.com/mysql/getting-started-with-mysql-access-control-system.html)
* [如何创建一个MySQL用户](http://www.yiibai.com/mysql/create-user.html)
* [如何授予MySQL用户权限](http://www.yiibai.com/mysql/grant.html)

## MySQL REVOKE语句简介

要从用户帐户撤销权限，您可以使用MySQL `REVOKE`语句。MySQL允许您从用户撤销一个或多个特权或所有权限。

以下说明从用户撤销指定权限的语法：

```sql
REVOKE   privilege_type [(column_list)]      
        [, priv_type [(column_list)]]...
ON [object_type] privilege_level
FROM user [, user]...
```

我们来详细看看MySQL `REVOKE`语句使用 -

* *首先*，在`REVOKE`关键字之后指定要从用户撤销的权限列表，需要用逗号分隔权限。
* *其次*，在`ON`子句中指定要撤销权限的权限级别。
* *第三*，在`FROM`子句中指定要撤销的权限的用户帐户

> 请注意，要从用户帐户撤销权限，您必须具有`GRANT OPTION`权限和要撤销的权限。

要撤消用户的所有权限，请使用以下`REVOKE`语句：

```sql
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user]…
```

要执行`REVOKE ALL`语句，必须具有全局`CREATE USER`权限或`mysql`数据库的`UPDATE`权限。

要撤销代理用户，请使用`REVOKE PROXY`命令，如下所示：

```sql
REVOKE PROXY ON user FROM user [, user]...
```

代理用户是MySQL中有效的用户，可以模拟(假冒)另一个用户，因此代理用户拥有其模拟的用户的所有权限。

在撤消用户权限之前，最好通过使用`SHOW GRANTS`语句来检查用户拥有的权限的情况，如下所示：

```sql
SHOW GRANTS FOR user;
```

## MySQL REVOKE示例

假设`rfc`用户对[示例数据库(yiibaidb)](http://www.yiibai.com/mysql/sample-database.html)具有[SELECT](http://www.yiibai.com/mysql/select-statement-query-data.html)，[UPDATE](http://www.yiibai.com/mysql/update-data.html)和[DELETE](http://www.yiibai.com/mysql/delete-statement.html)权限。现在，如果要从`rfc`用户撤销`UPDATE`和`DELETE`权限，可以按如下方式执行：

*首先*，使用`SHOW GRANTS`语句检查用户的权限：

```sql
-- 查看用户的当前权限
SHOW GRANTS FOR rfc;

-- 授予用户权限
GRANT SELECT, UPDATE, DELETE ON `yiibaidb`.* TO 'rfc'@'%';
```

执行上面查询语句，得到以下结果 -

```sql
+-----------------------------------------------------------+
| Grants for rfc@%                                          |
+-----------------------------------------------------------+
| GRANT USAGE ON *.* TO 'rfc'@'%'                           |
| GRANT SELECT, UPDATE, DELETE ON `yiibaidb`.* TO 'rfc'@'%' |
+-----------------------------------------------------------+
```

请注意，确实按照[授予用户权限的教程](http://www.yiibai.com/mysql/grant.html)文章学习并操作后，您可以创建`rfc`帐户并向其授予`SELECT`，`UPDATE`和`DELETE`特权，如下所示：

```sql
-- 创建用户
CREATE USER IF NOT EXISTS rfc IDENTIFIED BY 'newpasswd';

-- 授予用户权限
GRANT SELECT, UPDATE, DELETE ON  yiibaidb.* TO rfc;
```

*其次*，从`rfc`用户撤销`UPDATE`和`DELETE`权限，参考以下语句：

```sql
REVOKE UPDATE, DELETE ON yiibaidb.*  FROM rfc;
```

*第三*，可以使用`SHOW GRANTS`命令再次查看`rfc`用户的权限。

```sql
-- 查看用户权限
SHOW GRANTS FOR 'rfc'@'%';
-- 授予用户权限
GRANT SELECT ON `yiibaidb`.* TO 'rfc'@'%';
```

如果要撤销`rfc`用户的所有权限，请执行以下命令：

```sql
REVOKE ALL PRIVILEGES, GRANT OPTION FROM rfc;
```

如果再次查看`rfc`用户的权限，您将看到`rfc`用户已经没有了权限。

```sql
-- 查看用户权限
SHOW GRANTS FOR rfc;

GRANT USAGE ON *.* TO 'rfc'@'%';
```

> 请注意，使用`USAGE`权限意味着MySQL中没有特权。

## 当MySQL REVOKE命令生效时

MySQL `REVOKE`语句的生效时间取决于权限级别，如下所示：

* 客户端在后续会话中连接到MySQL时，对全局权限所做的更改才会生效。这些更改不适用于所有当前连接的用户。
* 数据库权限的更改将在下一个`USE`语句之后生效。
* 表和列权限的更改将在进行更改之后发出的所有查询时生效。

在本教程中，您学习了如何使用MySQL `REVOKE`语句来撤销MySQL用户的权限。
