CREATE USER 语句
CREATE USER [IF NOT EXISTS]user [auth_option] [, user [auth_option]] ...DEFAULT ROLE role [, role ] ...[REQUIRE {NONE | tls_option [[AND] tls_option] ...}][WITH resource_option [resource_option] ...][password_option | lock_option] ...[COMMENT 'comment_string' | ATTRIBUTE 'json_object']user:(see Section 6.2.4, “Specifying Account Names”)auth_option: {IDENTIFIED BY 'auth_string'| IDENTIFIED BY RANDOM PASSWORD| IDENTIFIED WITH auth_plugin| IDENTIFIED WITH auth_plugin BY 'auth_string'| IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD| IDENTIFIED WITH auth_plugin AS 'auth_string'}tls_option: {SSL| X509| CIPHER 'cipher'| ISSUER 'issuer'| SUBJECT 'subject'}resource_option: {MAX_QUERIES_PER_HOUR count| MAX_UPDATES_PER_HOUR count| MAX_CONNECTIONS_PER_HOUR count| MAX_USER_CONNECTIONS count}password_option: {PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]| PASSWORD HISTORY {DEFAULT | N}| PASSWORD REUSE INTERVAL {DEFAULT | N DAY}| PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]| FAILED_LOGIN_ATTEMPTS N| PASSWORD_LOCK_TIME {N | UNBOUNDED}}lock_option: {ACCOUNT LOCK| ACCOUNT UNLOCK}
CREATE USER 语句创建新的 MySQL帐户。它允许为新帐户建立身份验证、角色、SSL/TLS、资源限制和密码管理属性。它还控制帐户最初是锁定还是解锁。
要使用 CREATE USER,必须具有全局 CREATE USER权限,或者 mysql系统模式的 INSERT权限。启用 read_only系统变量时,CREATE USER还需要CONNECTION_ADMIN权限(或不推荐使用的 SUPER权限)。
从 MySQL 8.0.22 开始,如果要创建的任何帐户被命名为存储对象的DEFINER属性,CREATE USER将失败。(也就是说,如果创建帐户会导致该帐户采用当前孤立的存储对象,则该语句将失败。)要执行该操作,必须具有 SET_USER_ID权限;在这种情况下,该语句将成功,但会带有警告信息,而不是失败。没有 SET_USER_ID,则要执行用户创建操作,请删除孤立对象,创建帐户并授予其权限,然后重新创建删除的对象。
CREATE USER 要么对所有指定用户都成功,如果发生任何错误则回滚,不做任何更改。默认情况下,如果尝试创建已存在的用户,则会发生错误。如果给定 IF NOT EXISTS子句,则该语句将为已存在的每个指定用户生成警告,而不是错误。
CREATE USER 概述
对于每个帐户,CREATE USER 在 mysql.user系统表中创建一行新记录。帐户行反映语句中指定的属性。未指定的属性设置为其默认值:
● 身份验证:身份验证插件由 default_authentication_plugin 系统变量定义,凭据为空
● 默认角色:NONE
● SSL/TLS: NONE
● 资源限制:无限制
● 密码管理:PASSWORD EXPIRE DEFAULT PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; 禁用登录失败跟踪和临时帐户锁定
● 账户锁定:ACCOUNT UNLOCK
首次创建的帐户没有权限,默认角色为 NONE。要分配权限或角色,请使用GRANT语句。
账号名使用格式如下所示:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
如果省略帐户名的主机名部分,默认为 '%'。
指定帐户的每个user值后面都可以跟一个可选的auth_option值,该值指示帐户如何进行身份验证。这些值允许指定帐户身份验证插件和凭据(例如,密码)。每个auth_option值仅应用于紧跟在它前面的帐户。
根据用户规范,该语句可能包括 SSL/TLS、资源限制、密码管理和锁定属性的选项。所有这些选项对于语句都是全局的,并应用于语句中指定的所有帐户。
示例:创建一个使用默认身份验证插件和给定密码的帐户。将密码标记为过期,以便用户在第一次连接到服务器时必须选择新密码:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'new_password' PASSWORD EXPIRE;
示例:创建一个使用 caching_sha2_password 身份验证插件和给定密码的帐户。要求每 180天选择一个新密码,并启用失败登录跟踪,这样连续输入三个不正确的密码会导致临时帐户锁定两天:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'new_password' PASSWORD EXPIRE INTERVAL 180 DAY FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;
示例:创建多个帐户,指定一些基于帐户的属性和一些全局属性:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password1', 'jeanne'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'new_password2' REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 60 PASSWORD HISTORY 5 ACCOUNT LOCK;
每个auth_option值(在本例中为 IDENTIFIED WITH ... BY) 只应用于紧跟在它前面的帐户,因此每个帐户都使用紧跟其后的身份验证插件和密码。
其余属性全局应用于语句中指定的所有帐户,因此对于这两个帐户:
● 必须使用有效的 X.509 证书进行连接。
● 每小时最多允许 60 个查询。
● 更改密码不能重复使用最新的五个密码中的任何一个。
● 帐户最初是锁定的,因此实际上它是一个占位符,只有管理员解锁后才能使用。
从 MySQL 8.0.21 开始,可以选择创建带有用户注释或用户属性的用户,如下所述:
●用户注释
要设置用户注释,请将 COMMENT 'user_comment' 添加到CREATE USER语句中,其中user_comment是用户注释的文本。
示例(省略任何其他选项):
CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon';
●用户属性
用户属性是由一个或多个键值对组成的 JSON 对象,通过将ATTRIBUTE 'json_object' 作为CREATE USER的一部分来设置。json_object必须是有效的 JSON 对象。
示例(省略任何其他选项):
CREATE USER 'jim'@'localhost' ATTRIBUTE '{"fname": "James", "lname": "Scott", "phone": "123-456-7890"}';
用户注释和用户属性一起存储在 INFORMATION_SCHEMA.USER_ATTRIBUTES 表的 ATTRIBUTE列。此查询显示表中由刚才创建用户 jim@localhost的语句插入的行:
mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES -> WHERE USER = 'jim' AND HOST = 'localhost'\G*************************** 1. row *************************** USER: jim HOST: localhostATTRIBUTE: {"fname": "James", "lname": "Scott", "phone": "123-456-7890"}1 row in set (0.00 sec)
实际上,COMMENT 选项提供了一个快捷方式,用于设置用户属性,该属性的唯一元素的键是 comment,其值是为该选项提供的参数。可以通过执行CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon'语句并观察它插入到 USER_ATTRIBUTES表中的行来看到这一点:
mysql> CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon';Query OK, 0 rows affected (0.06 sec)mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES-> WHERE USER = 'jon' AND HOST = 'localhost';+------+-----------+-------------------------------------------+| USER | HOST | ATTRIBUTE |+------+-----------+-------------------------------------------+| jon | localhost | {"comment": "Some information about Jon"} |+------+-----------+-------------------------------------------+1 row in set (0.00 sec)
不能在同一 CREATE USER 语句中同时使用 COMMENT和 ATTRIBUTE;尝试这样做会导致语法错误。要在设置用户属性的同时设置用户注释,请使用 ATTRIBUTE并在其参数中包含带有 comment键的值,如下所示:
mysql> CREATE USER 'bill'@'localhost' -> ATTRIBUTE '{"fname":"William", "lname":"Schmidt", -> "comment":"Website developer"}';Query OK, 0 rows affected (0.16 sec)
由于 ATTRIBUTE 列的内容是一个 JSON对象,因此可以使用任何适当的MySQL JSON函数或运算符来操作它,如下所示:
mysql> SELECT -> USER AS User, -> HOST AS Host, -> CONCAT(ATTRIBUTE->>"$.fname"," ",ATTRIBUTE->>"$.lname") AS 'Full Name', -> ATTRIBUTE->>"$.comment" AS Comment -> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES -> WHERE USER='bill' AND HOST='localhost';+------+-----------+-----------------+-------------------+| User | Host | Full Name | Comment |+------+-----------+-----------------+-------------------+| bill | localhost | William Schmidt | Website developer |+------+-----------+-----------------+-------------------+1 row in set (0.00 sec)
要设置或更改现有用户的用户注释或用户属性,可以将 COMMENT 或ATTRIBUTE选项与 ALTER USER语句一起使用。
因为用户注释和用户属性在内部存储在一个 JSON 列中,所以这会对它们的最大组合大小设置一个上限。