Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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

管理 MySQL 账户,使用以下 SQL 语句:

账户管理语句会导致服务器对底层授权表进行相应修改,关于授权表的讨论见第8.2.3节,“授权表”

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 域中的任何主机连接。

    如果存在匿名用户帐户localhost,那么需要'finley'@'localhost'帐户。否则,'finley'从本地主机连接时将被视为匿名用户。这是因为匿名用户帐户的Host列值比'finley'@'%'帐户更具体,因此在user表排序中排前。关于user表排序的信息,请参见第8.2.6节,“连接验证,阶段1:连接验证”

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

  • ‘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域中的任何主机连接到服务器,due to 使用了在帐户名主机部分的*wildcard 字符。

查看帐户的权限,请使用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';