Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Adding Accounts, Assigning Privileges, and Dropping Accounts

8.2.8 添加账户、分配权限和删除账户

要管理 MySQL 账户,请使用专门的 SQL 语句:

账户管理语句会导致服务器对基础授权表进行相应的修改,这些表在 第 8.2.3 节“Grant Tables” 中讨论。

Note

使用语句如 INSERTUPDATEDELETE 直接修改授权表是不被推荐的,并且可能会导致服务器忽略由于这种修改而变得畸形的行。

对于任何修改授权表的操作,服务器都会检查表是否具有预期的结构,并在不符合时产生错误。要更新表以达到预期的结构,请执行 MySQL 升级过程。见 第 3 章升级 MySQL

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

本节讨论以下主题:

有关这些语句的更多信息,请参见 第 15.7.1 节“账户管理语句”

创建账户和分配权限

以下示例显示如何使用 mysql 客户端程序来设置新账户。这些示例假设 MySQL root 账户具有 CREATE USER 权限和授予其他账户的所有权限。

在命令行中,以 MySQL root 用户身份连接到服务器,输入适当的密码:

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

连接到服务器后,可以添加新账户。以下示例使用 CREATE USER GRANT 语句来设置四个账户(在您看到 'password' 时,请替换为适当的密码):

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。这两个账户都是超级用户账户,具有全局权限来执行任何操作。'finley'@'localhost' 账户只能在本地主机上使用。'finley'@'%.example.com' 账户使用 '%' 通配符在主机部分,因此可以从 example.com 域中的任何主机连接。

    需要 'finley'@'localhost' 账户,因为如果存在匿名用户账户 для localhost,那么在 finley 从本地主机连接时,finley 将被视为匿名用户。原因是匿名用户账户在 user 表中的 Host 列值比 'finley'@'%' 账户更具体,因此在 user 表排序中排在前面。(有关 user 表排序的信息,请参见 第 8.2.6 节“访问控制、阶段 1:连接验证”。)

  • 管理员 'admin'@'localhost' 帐户只能由管理员从本地主机连接使用。它被授予了全局 RELOADPROCESS 管理权限。这些权限使管理员用户能够执行 mysqladmin reload, mysqladmin refresh, 和 mysqladmin flush-xxx 命令,以及 mysqladmin processlist 。没有授予访问任何数据库的权限。你可以使用 GRANT 语句添加这样的权限。

  • dummy 'dummy'@'localhost' 帐户没有密码(这是不安全的,不建议使用)。该帐户只能从本地主机连接使用。没有授予任何权限。假设你使用 GRANT 语句授予该帐户特定的权限。

前面的示例授予了全局级别的权限。下一个示例创建了三个帐户,并授予了它们在较低级别的访问权限;即,到特定的数据库或数据库中的对象。每个帐户的用户名都是 custom,但主机名部分不同:

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

三个帐户可以如下使用:

  • 'custom'@'localhost' 帐户拥有访问 bankaccount 数据库的所有数据库级别权限。该帐户只能从本地主机连接到服务器。

  • 'custom'@'host47.example.com' 帐户拥有访问 expenses 数据库的特定数据库级别权限。该帐户只能从主机 host47.example.com 连接到服务器。

  • 'custom'@'%.example.com' 帐户拥有访问 customer 数据库中的 addresses 表的特定表级别权限,从 example.com 域中的所有机器连接到服务器,因为在帐户名称的主机部分使用了 % 通配符。

检查帐户权限和属性

要查看帐户的权限,使用 SHOW GRANTS

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

要查看帐户的非权限属性,使用 SHOW CREATE USER

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 系统变量会使 SHOW CREATE USER 以十六进制字符串形式显示包含不可打印字符的哈希值,而不是作为常规字符串文字。

撤销帐户权限

要撤销帐户权限,使用 REVOKE 语句。权限可以在不同的级别撤销,就像它们可以在不同的级别授予一样。

撤销全局权限:

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

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

删除帐户

要删除帐户,使用 DROP USER 语句。例如,要删除之前创建的一些帐户:

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