### 6.2.8 添加帐户、分配权限和删除帐户

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

要管理 MySQL 帐户，请使用用于该目的的 SQL 语句：

-   [`创建用户`](create-user.html)和[`删除用户`](drop-user.html)创建和删除帐户。

-   [`授予`](grant.html)和[`撤销`](revoke.html)为帐户分配权限和撤销帐户的权限。

-   [`显示赠款`](show-grants.html)显示帐户权限分配。

    帐户管理语句使服务器对底层授权表进行适当的修改，这些修改在[第 6.2.3 节，“授权表”](grant-tables.html).

笔记

使用语句直接修改授权表，例如[`插入`](insert.html),[`更新`](update.html)， 要么[`删除`](delete.html)不鼓励这样做，风险自负。服务器可以自由地忽略由于此类修改而导致格式错误的行。

对于修改授权表的任何操作，服务器都会检查该表是否具有预期的结构，如果没有则产生错误。要将表更新为预期的结构，请执行 MySQL 升级过程。看[第 2.11 节，“升级 MySQL”](upgrading.html).

创建帐户的另一个选项是使用 GUI 工具 MySQL Workbench。此外，一些第三方程序提供 MySQL 帐户管理功能。`phpMyAdmin`就是这样一个程序。

本节讨论以下主题：

-   [创建帐户和授予权限](creating-accounts.html#creating-accounts-granting-privileges)

-   [检查帐户权限和属性](creating-accounts.html#checking-account-privileges)

-   [撤销帐户权限](creating-accounts.html#revoking-account-privileges)

-   [删除帐户](creating-accounts.html#dropping-accounts)

    有关此处讨论的陈述的更多信息，请参阅[第 13.7.1 节，“账户管理声明”](account-management-statements.html).

#### 创建帐户和授予权限

下面的例子展示了如何使用[**mysql**](mysql.html)客户程序来设置新帐户。这些示例假设 MySQL`根`帐户有[`创建用户`](privileges-provided.html#priv_create-user)特权以及它授予其他帐户的所有特权。

在命令行中，以 MySQL 身份连接到服务器`根`用户，在密码提示符处提供适当的密码：

```
$> mysql -u root -p
Enter password: (enter root password here)
```

连接到服务器后，您可以添加新帐户。以下示例使用[`创建用户`](create-user.html)和[`授予`](grant.html)建立四个帐户的报表（您在哪里看到`'*`密码`*'`，替换适当的密码）：

```
CREATE USER 'finley'@'localhost'
  IDENTIFIED BY 'password';
GRANT ALL
  ON *.*
  TO 'finley'@'localhost'
  WITH GRANT OPTION;

CREATE USER 'finley'@'%.example.com'
  IDENTIFIED BY 'password';
GRANT ALL
  ON *.*
  TO 'finley'@'%.example.com'
  WITH GRANT OPTION;

CREATE USER 'admin'@'localhost'
  IDENTIFIED BY 'password';
GRANT RELOAD,PROCESS
  ON *.*
  TO 'admin'@'localhost';

CREATE USER 'dummy'@'localhost';
```

这些报表创建的帐户具有以下属性：

-   两个帐户的用户名为`芬利`.两者都是具有完全全局权限的超级用户帐户，可以执行任何操作。这`'芬利'@'本地主机'`只有从本地主机连接时才能使用帐户。这`'finley'@'%.example.com'`帐户使用`'%'`主机部分中的通配符，因此它可用于从主机中的任何主机进行连接`例子.com`领域。

    这`'芬利'@'本地主机'`如果有匿名用户帐户，则帐户是必需的`本地主机`.没有`'芬利'@'本地主机'`帐户，该匿名用户帐户优先`芬利`从本地主机连接并`芬利`被视为匿名用户。原因是匿名用户帐户具有更具体的`主持人`列值比`'芬利'@'%'`帐户，因此较早出现在`用户`表排序顺序。（有关信息`用户`表排序，见[第 6.2.6 节，“访问控制，第 1 阶段：连接验证”](connection-access.html).)

-   这`'管理员'@'本地主机'`帐户只能由以下人员使用`行政`从本地主机连接。它被授予全球[`重新加载`](privileges-provided.html#priv_reload)和[`过程`](privileges-provided.html#priv_process)管理权限。这些特权使`行政`用户执行[**mysqladmin 重新加载**](mysqladmin.html),[**mysqladmin 刷新**](mysqladmin.html)， 和[**mysqladmin 冲洗-*`xxx`***](mysqladmin.html)命令，以及[**mysqladmin 进程列表**](mysqladmin.html).没有授予访问任何数据库的权限。您可以使用添加此类权限[`授予`](grant.html)陈述。

-   这`'虚拟'@'本地主机'`帐户没有密码（这是不安全的，不推荐）。此帐户只能用于从本地主机连接。不授予任何特权。假设您使用以下方式向帐户授予特定权限[`授予`](grant.html)陈述。

    前面的示例在全局级别授予权限。下一个示例创建三个帐户并授予他们较低级别的访问权限；即，特定数据库或数据库中的对象。每个帐户都有一个用户名`风俗`，但主机名部分不同：


```
CREATE USER 'custom'@'localhost'
  IDENTIFIED BY 'password';
GRANT ALL
  ON bankaccount.*
  TO 'custom'@'localhost';

CREATE USER 'custom'@'host47.example.com'
  IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  ON expenses.*
  TO 'custom'@'host47.example.com';

CREATE USER 'custom'@'%.example.com'
  IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  ON customer.addresses
  TO 'custom'@'%.example.com';
```

这三个帐户可以按如下方式使用：

-   这`'自定义'@'本地主机'`帐户拥有所有数据库级别的权限来访问`银行账户`数据库。该帐户只能用于从本地主机连接到服务器。

-   这`'自定义'@'host47.example.com'`帐户具有特定的数据库级权限来访问`花费`数据库。该帐户只能用于从主机连接到服务器`host47.example.com`.

-   这`'自定义'@'%.example.com'`帐户具有特定的表级权限来访问`地址`表中的`顾客`数据库中的任何主机`例子.com`领域。该帐户可用于从域中的所有计算机连接到服务器，因为使用`%`帐户名称的主机部分中的通配符。

#### 检查帐户权限和属性

[](<>)[](<>)

要查看帐户的权限，请使用[`显示赠款`](show-grants.html)：

```
mysql> SHOW GRANTS FOR 'admin'@'localhost';
+-----------------------------------------------------+
| Grants for admin@localhost                          |
+-----------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO `admin`@`localhost` |
+-----------------------------------------------------+
```

要查看帐户的非特权属性，请使用[`显示创建用户`](show-create-user.html)：

```
mysql> SET print_identified_with_as_hex = ON;
mysql> SHOW CREATE USER 'admin'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for admin@localhost: CREATE USER `admin`@`localhost`
IDENTIFIED WITH 'caching_sha2_password'
AS 0x24412430303524301D0E17054E2241362B1419313C3E44326F294133734B30792F436E77764270373039612E32445250786D43594F45354532324B6169794F47457852796E32
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT
```

启用[`print_identified_with_as_hex`](server-system-variables.html#sysvar_print_identified_with_as_hex)系统变量（自 MySQL 8.0.17 起可用）导致[`显示创建用户`](show-create-user.html)将包含不可打印字符的哈希值显示为十六进制字符串，而不是常规字符串文字。

#### 撤销帐户权限

[](<>)[](<>)

要撤销帐户权限，请使用[`撤销`](revoke.html)陈述。特权可以在不同级别被撤销，就像它们可以在不同级别被授予一样。

撤销全局权限：

```
REVOKE ALL
  ON *.*
  FROM 'finley'@'%.example.com';

REVOKE RELOAD
  ON *.*
  FROM 'admin'@'localhost';
```

撤销数据库级权限：

```
REVOKE CREATE,DROP
  ON expenses.*
  FROM 'custom'@'host47.example.com';
```

撤销表级权限：

```
REVOKE INSERT,UPDATE,DELETE
  ON customer.addresses
  FROM 'custom'@'%.example.com';
```

要检查特权撤销的效果，请使用[`显示赠款`](show-grants.html)：

```
mysql> SHOW GRANTS FOR 'admin'@'localhost';
+---------------------------------------------+
| Grants for admin@localhost                  |
+---------------------------------------------+
| GRANT PROCESS ON *.* TO `admin`@`localhost` |
+---------------------------------------------+
```

#### 删除帐户

[](<>)[](<>)[](<>)[](<>)

要删除帐户，请使用[`删除用户`](drop-user.html)陈述。例如，要删除之前创建的一些帐户：

```
DROP USER 'finley'@'localhost';
DROP USER 'finley'@'%.example.com';
DROP USER 'admin'@'localhost';
DROP USER 'dummy'@'localhost';
```
