ITPub博客

首页 > 数据库 > > 13.7 数据库管理语句(1)

13.7 数据库管理语句(1)

作者:飘絮絮絮丶 时间:2020-05-12 10:17:02 0 删除 编辑

参考官方文档:

dev.mysql.com/doc/refma


13.7.1 账户管理语句


MySQL帐户信息存储在mysql数据库的表中。


当启用read_only系统变量时,除了任何其他所需特权之外,帐户管理语句还需要SUPER特权。 这是因为他们修改了mysql数据库中的表。


13.7.1.1 ALTER USER 语法


ALTER USER [IF EXISTS] user [auth_option] [, user [auth_option]] ...

[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]

[WITH resource_option [resource_option] ...] [password_option | lock_option] ...


ALTER USER [IF EXISTS] USER() IDENTIFIED BY 'auth_string'


ALTER USER语句修改MySQL帐户。 它可以为现有帐户修改身份验证,SSL / TLS,资源限制和密码管理属性,并启用帐户锁定和解锁。


要使用ALTER USER,您必须具有MySQL数据库的全局CREATE USER权限或UPDATE权限。 当启用read_only系统变量时,ALTER USER另外需要SUPER权限。


默认情况下,如果您尝试修改不存在的用户,则会发生错误。 如果给出IF EXISTS子句,则该语句为每个不存在的命名用户生成一个警告,而不是一个错误。


注意:

在某些情况下,ALTER USER可能会记录在服务器日志中或客户端的历史文件(如〜/ .mysql_history)中,这意味着明文密码可能被读取该信息的任何人阅读


ALTER USER 概述


对于每个受影响的帐户,ALTER USER修改相应的mysql.user表行以反映在语句中指定的属性。 未指定的属性保留其当前值。

示例1:更改帐户的密码并使其过期。 因此,用户必须在下一个连接时选择新密码:


ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'new_password' PASSWORD EXPIRE;


例子2:

修改一个帐户以使用sha256_password认证插件和给定的密码。 要求每180天选择一个新密码:


ALTER USER 'jeffrey'@'localhost' IDENTIFIED WITH sha256_password BY 'new_password' PASSWORD EXPIRE INTERVAL 180 DAY;

例子3:锁定和角色一个账户:

ALTER USER 'jeffrey'@'localhost' ACCOUNT LOCK;

ALTER USER 'jeffrey'@'localhost' ACCOUNT UNLOCK;


示例4:要求帐户使用SSL进行连接,并建立每小时20个连接的限制:


ALTER USER 'jeffrey'@'localhost'

REQUIRE SSL WITH MAX_CONNECTIONS_PER_HOUR 20;


每个帐户名称使用第6.2.3节“指定帐户名称”中描述的格式。 帐户名称的主机名部分(如果省略)默认为'%'。 也可以指定CURRENT_USER或CURRENT_USER()来引用与当前会话关联的帐户。


仅限一种语法,可以使用USER()函数指定帐户:

ALTER USER USER() IDENTIFIED BY 'auth_string';


此语法可以更改您自己的密码,而不需要直接的帐户名。


对于允许auth_option值遵循用户值的ALTER USER语法,auth_option通过指定帐户身份验证插件,凭据(例如密码)或两者来指示帐户如何进行身份验证。 每个auth_option值仅适用于紧接在其之前命名的帐户。

遵循用户规范,该语句可能包含SSL/TLS选项,资源限制,密码管理和锁定属性。 所有这些选项对声明都是全局性的,并适用于all 指定账户。


示例:此语句更改两个帐户,指定一些每个帐户的属性和一些全局属性:


ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'new_password', 'jeanne'@'localhost' REQUIRE SSL WITH MAX_USER_CONNECTIONS 2;

jeffrey(IDENTIFIED BY)后面的auth_option值仅适用于其之前的帐户,因此它仅更改jeffrey的密码。 对于jeanne,没有帐户值(因此保持密码不变)。 其余属性全局适用于该语句。 对于这两个帐户,需要连接才能使用SSL,并且每个帐户最多可以用于两个同时连接:


在没有特定类型的选择的情况下,该账户在这方面保持不变。 例如,没有锁定选项,帐户的锁定状态不会更改。


ALTER USER 认证选项


帐户名称后可跟随一个auth_option认证选项,该选项指定帐户认证插件,凭证或两者:

  • auth_plugin 命名认证插件。 插件名称可以是带引号的字符串或不带引号的名称。 插件名称存储在mysql.user系统表的插件列中。

对于不指定身份验证插件的auth_option语法,默认插件由default_authentication_plugin系统变量的值指示。

  • 凭证存储在mysql.user系统表的authentication_string列中。 “auth_string”或“hash_string”值指定帐户凭证,可以是明文(未加密)字符串,也可以是与帐户关联的验证插件预期的格式的哈希值:
    • 对于使用'auth_string'的语法,字符串是明文,并传递给认证插件以进行散列。 插件返回的结果存储在authentication_string列中。 插件可以使用指定的值,在这种情况下不会发生散列。
    • 对于使用'hash_string'的语法,字符串被认为已经以认证插件所需的格式进行散列。 如果插件的散列格式不合适,它将不可用,并且不会发生客户端连接的正确认证。

ALTER USER允许这些auth_option语法:

  • IDENTIFIED BY 'auth_string'

将帐户身份验证插件设置为默认插件,将明文“auth_string”值传递给哈希插件,并将结果存储在mysql.user帐户行中。

  • IDENTIFIED WITH auth_plugin

将帐户身份验证插件设置为auth_plugin,将凭据清除为空字符串(凭据与旧身份验证插件关联,而不是新身份验证插件),并将结果存储在mysql.user帐户行中。

另外,密码被标记为过期。 下次连接时用户必须选择新的。

  • IDENTIFIED WITH auth_plugin BY 'auth_string'

将帐户身份验证插件设置为auth_plugin,将明文“auth_string”值传递给哈希插件,并将结果存储在mysql.user帐户行中。


  • IDENTIFIED WITH auth_plugin AS 'hash_string'

将帐户身份验证插件设置为auth_plugin,并将散列的'hash_string'值保存在mysql.user帐户行中。 假定该字符串已经按照插件所需的格式进行散列处理。

例子1:将密码指定为明文; 使用默认插件:

ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';


示例2:指定验证插件以及明文密码值:


ALTER USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';


示例3:指定验证插件以及哈希密码值:


ALTER USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password AS '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';


ALTER USER SSL/TLS 选项

除了基于用户名和凭证的常规认证之外,MySQL还可以检查X509证书属性。


要为MySQL帐户指定SSL / TLS相关选项,请使用指定一个或多个tls_option值的REQUIRE子句。


REQUIRE选项的顺序无关紧要,但没有选项可以指定两次。 AND关键字在REQUIRE选项之间是可选的。

ALTER USER允许这些tls_option值:


  • NONE

表示该帐户没有SSL或X509要求。 如果用户名和密码有效,则允许未加密的连接。 如果客户端有适当的证书和密钥文件,在客户端的选择下,则可以使用加密连接。


ALTER USER 'jeffrey'@'localhost' REQUIRE NONE;

客户端默认尝试建立安全连接。 对于没有REQUIRE NONE的客户端,如果无法建立安全连接,则连接尝试将回退到未加密的连接。 要求加密的连接,客户端只需要指定--ssl-mode = REQUIRED选项; 如果无法建立安全连接,则连接尝试失败。

  • SSL

告诉服务器只允许该帐户的加密连接。

ALTER USER 'jeffrey'@'localhost' REQUIRE SSL;

客户端默认尝试建立安全连接。 对于具有REQUIRE SSL的帐户,如果无法建立安全连接,则连接尝试失败

  • X509

要求客户出示有效证书,但确切的证书,发行人和主题无关紧要。 唯一的要求是应该可以使用其中一个CA证书验证其签名。 使用X509证书总是意味着加密,所以在这种情况下SSL选项是不必要的。

ALTER USER 'jeffrey'@'localhost' REQUIRE X509;

对于使用REQUIRE X509的帐户,客户端必须指定--ssl-key和--ssl-cert选项才能进行连接。 (建议但不要求指定--ssl-ca,以便可以验证服务器提供的公共证书。)对于ISSUER和SUBJECT也是如此,因为这些REQUIRE选项意味着X509的要求。

  • ISSUER 'issuer'

要求客户出示由CA颁发者颁发的有效X509证书。 如果客户端提供的证书有效但具有不同的颁发者,则服务器拒绝该连接。 使用X509证书总是意味着加密,所以在这种情况下SSL选项是不必要的。

ALTER USER 'jeffrey'@'localhost' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/ O=MySQL/CN=CA/emailAddress=ca@example.com';

由于ISSUER意味着X509的要求,因此客户端必须指定--ssl-key和--ssl-cert选项进行连接。 (建议但不要求--ssl-ca也可以指定,以便可以验证服务器提供的公共证书。)

  • SUBJECT 'subject'

要求客户出示包含主题主题的有效X509证书。 如果客户端提供的证书有效但具有不同的主题,则服务器会拒绝该连接。 使用X509证书总是意味着加密,所以在这种情况下SSL选项是不必要的。


ALTER USER 'jeffrey'@'localhost' REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/ O=MySQL demo client certificate/ CN=client/emailAddress=client@example.com';

MySQL将'主题'值与证书中的值进行简单的字符串比较,因此必须准确地给出lettercase和component order与证书中的值相同。


由于SUBJECT暗示了X509的要求,因此客户端必须指定--ssl-key和--ssl-cert选项才能进行连接。 (建议但不要求--ssl-ca也可以指定,以便可以验证服务器提供的公共证书。)


  • CIPHER 'cipher'

需要特定的密码方法来加密连接。 需要此选项以确保使用足够强度的密码和密钥长度。 如果使用使用短加密密钥的旧算法,则加密可能很弱。


ALTER USER 'jeffrey'@'localhost' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';


SUBJECT,ISSUER和CIPHER选项可以组合在REQUIRE子句中:


ALTER USER 'jeffrey'@'localhost' REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/ O=MySQL demo client certificate/ CN=client/emailAddress=client@example.com' AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/ O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA';


ALTER USER 资源限制选项


如第6.3.5节“设置帐户资源限制”中所述,可以限制帐户使用服务器资源的限制。 为此,请使用指定一个或多个resource_option值的WITH子句。


WITH选项的顺序无关紧要,除非如果给定资源限制多次指定,则最后一个实例优先。


ALTER USER允许这些resource_option值:


  • MAX_QUERIES_PER_HOUR count,MAX_UPDATES_PER_HOUR count,MAX_CONNECTIONS_PER_HOUR count

这些选项会限制在任何给定的一小时内允许此帐户允许多少个查询,更新和服务器连接。 (从查询缓存中获得结果的查询不会计入MAX_QUERIES_PER_HOUR限制。)如果 count为0(默认值),则表示该帐户没有限制。

  • MAX_USER_CONNECTIONS count

限制帐户同时连接服务器的最大数量。 非零计数明确指定帐户的限制。 如果count为0(默认值),则服务器将根据max_user_connections系统变量的全局值确定帐户的同时连接数。 如果max_user_connections也为零,则该帐户没有限制。


例子:

ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;

ALTER USER 密码管理选项


ALTER USER为密码过期管理支持多个password_option,以便手动过期帐户密码或建立其密码过期策略。 策略选项不会过期密码。 相反,他们确定服务器如何根据帐户密码的年龄将自动过期应用于帐户。 对于给定帐户,其密码年龄根据最近密码更改的日期和时间进行评估。


这些选项适用于使用MySQL内置身份验证插件(mysql_native_password或caching_sha2_password)的帐户。 对于使用对外部凭证系统执行验证的插件的帐户,密码到期也必须在外部处理。


如果帐户密码手动过期或者认为密码年龄大于自动过期策略的允许使用期限,则客户端会话将以限制模式运行。 在限制模式下,会话中执行的操作会导致错误,直到用户建立新的帐户密码。


ALTER USER允许这些password_option值:

  • PASSWORD EXPIRE

立即过期帐户密码。

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;

  • PASSWORD EXPIRE DEFAULT

根据default_password_lifetime系统变量的指定设置帐户,以便应用全局到期策略。

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;

  • PASSWORD EXPIRE NEVER

禁用该帐户的密码到期,以便其密码永不过期。

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;

  • PASSWORD EXPIRE INTERVAL N DAY

将帐户密码的有效期限设置为N天。 此声明要求密码每180天更改一次:

ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;

如果指定了多个密码管理选项,则最后一个优先。

注意:

可以通过将密码设置为当前值来“重置”密码。 作为一个良好的政策,最好选择一个不同的密码。


更改用户帐户锁定选项


MySQL使用ACCOUNT LOCK和ACCOUNT UNLOCK选项来支持帐户锁定和解锁,这些选项指定帐户的锁定状态。

如果指定了多个帐户锁定选项,则最后一个优先。


13.7.1.2 CREATE USER 语法


CREATE USER语句创建新的MySQL帐户。 它可以为新帐户建立认证,SSL / TLS,资源限制和密码管理属性,并控制帐户最初是锁定还是解锁。


要使用CREATE USER,您必须具有全局CREATE USER权限或MySQL数据库的INSERT权限。 当启用read_only系统变量时,CREATE USER还需要SUPER权限。


如果您尝试创建已存在的帐户,则会发生错误。 如果给出了IF NOT EXISTS子句,则该语句会为每个已存在的已命名帐户生成警告,而不是错误。


重要的:

在某些情况下,CREATE USER可能会记录在服务器日志中或客户端的历史文件(如〜/ .mysql_history)中,这意味着任何具有读取该信息读取权限的人都可以读取明文密码。


CREATE USER 概述

对于每个帐户,CREATE USER在mysql.user系统表中创建一个新行。 账户行反映了在语句中指定的属性。 未指定的属性设置为其默认值:


  • 身份验证:由default_authentication_plugin系统变量定义的身份验证插件,以及空凭证
  • SSL/TLS:NONE
  • 资源限制:无限制
  • 密码管理: PASSWORD EXPIRE DEFAULT
  • 账户锁定: ACCOUNT UNLOCK

首次创建的帐户没有权限。 要分配权限,请使用GRANT语句。

示例1:创建一个使用默认身份验证插件和给定密码的帐户。 将密码标记为已过期,以便用户必须在第一次连接到服务器时选择一个新密码:


CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'new_password' PASSWORD EXPIRE;


示例2:创建一个使用sha256_password认证插件和给定密码的帐户。 要求每180天选择一个新密码:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH sha256_password BY 'new_password' PASSWORD EXPIRE INTERVAL 180 DAY;


每个帐户名称使用第6.2.3节“指定帐户名称”中描述的格式。 例如:


CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';


帐户名称的主机名部分(如果省略)默认为'%'。


每个用户名称指定一个帐户后可能会有一个可选的auth_option值,指示帐户如何进行身份验证。 这些值可以指定帐户身份验证插件和凭据(例如,密码)。 每个auth_option值仅适用于紧接在其之前命名的帐户。


遵循用户规范,该语句可能包含SSL/TLS选项,资源限制,密码管理和锁定属性。 所有这些选项对声明都是全局性的,并适用于所有指定账户。


示例:此语句创建两个帐户,指定一些每个帐户属性和一些全局属性:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password1', 'jeanne'@'localhost' IDENTIFIED WITH sha256_password BY 'new_password2' REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 60 ACCOUNT LOCK;


每个auth_option值(在此情况下为IDENTIFIED WITH ... BY)仅适用于其之前的帐户,因此每个帐户都使用指定的身份验证插件和密码。 其余属性全局适用于该语句。 对于这两个帐户,连接必须使用有效的X509证书进行,每小时最多允许60个查询。 这两个帐户最初都是锁定的,因此它们是占位符,并且只有在管理员解锁后才能使用。


示例1:将密码指定为明文; 使用默认插件:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';


示例2:指定验证插件以及明文密码值:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';


在每种情况下,存储在帐户行中的密码值在与帐户关联的验证插件散列之后是明文值“密码”。


--其他的内容和 alter user 语法类似。


13.7.1.3 DROP USER 语法


DROP USER [IF EXISTS] user [, user] ...


DROP USER语句删除一个或多个MySQL帐户及其权限。 它从所有授权表中删除帐户的权限行。


要使用DROP USER,您必须具有全局CREATE USER权限或mysql数据库的DELETE权限。 当启用read_only系统变量时,DROP USER另外需要SUPER权限。


如果您尝试删除不存在的帐户,则会发生错误。 如果给出IF EXISTS子句,则该语句为每个不存在的命名用户生成一个警告,而不是一个错误。


每个帐户名称使用第6.2.3节“指定帐户名称”中描述的格式。 例如:

DROP USER 'jeffrey'@'localhost';


帐户名称的主机名部分(如果省略)默认为'%'。

重要:

DROP USER不会自动关闭任何打开的用户会话。 相反,如果具有打开会话的用户被删除,则在该用户的会话关闭之前,该语句才会生效。 会话关闭后,用户将被丢弃,并且该用户的下一次尝试登录将失败。 这是设计。


DROP USER不会自动删除或失效旧用户创建的数据库或对象。 这包括存储的程序或DEFINER属性为其删除的用户命名的视图。 尝试访问这些对象如果在定义者安全上下文中执行,则可能会产生错误。


13.7.1.4 GRANT 语法


GRANT语句授予MySQL用户帐户权限。

GRANT 一般概述

GRANT语句授予MySQL用户帐户权限。


要使用GRANT,您必须具有GRANT OPTION权限,并且您必须拥有您授予的权限。 当启用read_only系统变量时,GRANT还需要SUPER权限。


REVOKE声明与GRANT相关,并使管理员能够删除帐户权限。


每个帐户名称使用第6.2.3节“指定帐户名称”中描述的格式。 例如:

GRANT ALL ON db1.* TO 'jeffrey'@'localhost';


该帐户的主机名部分(如果省略)默认为'%'。


通常情况下,数据库管理员首先使用CREATE USER创建一个帐户并定义其非权限特性,例如密码,是否使用安全连接,限制对服务器资源的访问,然后使用GRANT定义其权限。 ALTER USER可用于更改现有帐户的非权限特性。 例如:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password'; GRANT ALL ON db1.* TO 'jeffrey'@'localhost';

GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';

ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;


注意:

此处显示的示例不包含IDENTIFIED子句。 假设您在创建帐户时使用CREATE USER建立密码,以避免创建不安全的帐户。

注意:

如果在GRANT语句中命名的账户不存在,GRANT可以在后面讨论NO_AUTO_CREATE_USER SQL模式的条件下创建它。 也可以使用GRANT来指定非特权帐户特征,例如它是否使用安全连接并限制对服务器资源的访问。


但是,从MySQL 5.7.6起,不推荐使用GRANT创建帐户或定义非特权特性。 相反,使用CREATE USER或ALTER USER执行这些任务。


在mysql程序中,GRANT响应 Query OK, 0 rows affected。 要确定操作产生的权限,请使用SHOW GRANTS


重要:

在某些情况下,GRANT可能记录在服务器日志中或客户端的历史文件(例如〜/ .mysql_history)中,这意味着任何具有读取该信息读取权限的人都可以读取明文密码。


GRANT支持长达60个字符的主机名称。 用户名称最多可以包含32个字符。 数据库,表,列和例程名称最多可以包含64个字符。


警告:

不要试图通过更改mysql.user表来更改用户名的允许长度。 这样做会导致不可预知的行为,甚至可能导致用户无法登录到MySQL服务器。 除非通过第4.4.7节“mysql_upgrade - 检查并升级MySQL表”中描述的过程,否则不要以任何方式更改mysql数据库中表的结构。


对象引用指南


在许多情况下,GRANT 语句中的一些对象的引号是可选的。 例如,如果帐户名称中的user_name或host_name值作为非引用标识符合法,则不需要引用该值。 但是,必须使用引号来指定包含特殊字符(例如 - )的user_name字符串或包含特殊字符或通配符(例如%)的host_name字符串; 例如,'test-user'@'%.com'。 分别引用用户名和主机名。


要指定引用的值:

  • 引用数据库,表,列和例程名称作为标识符。
  • 引用用户名和主机名作为标识符或字符串。
  • 引用密码为字符串。


在GRANT语句中指定数据库名称时,允许使用_和%通配符,这些语句授予数据库级别的权限。 这意味着,例如,要将_字符用作数据库名称的一部分,请在GRANT语句中将其指定为\ _,以防止用户能够访问与通配符模式相匹配的其他数据库; 例如,GRANT ... ON `foo\ _bar` .* TO ....

MYSQL 支持的权限

触发器与表关联。 要创建或删除触发器,您必须具有表的TRIGGER权限,而不是触发。

在GRANT语句中,ALL [PRIVILEGES]或PROXY特权必须由其自身命名,并且不能与其他权限一起指定。 ALL [PRIVILEGES]表示除了GRANT OPTION和PROXY权限外,授予权限级别的所有可用权限。

可以指定USAGE来创建没有权限的用户,或者为帐户指定REQUIRE或WITH子句而不更改其现有权限。 (但是,不赞成使用GRANT来定义非特权特性。)


如果授予表保存包含混合大小数据库或表名称的权限行,并且lower_case_table_names系统变量设置为非零值,则不能使用REVOKE来撤销这些特权。 有必要直接操作授权表。 (当设置lower_case_table_names时,GRANT不会创建这样的行,但可能在设置该变量之前创建了这样的行。)

根据ON子句使用的语法,可以在几个级别授予权限。 对于REVOKE,相同的ON语法指定要删除的权限。


对于全局,数据库,表和常规级别,GRANT ALL只分配您授予的级别上存在的权限。 例如,GRANT ALL ON db_name.*是一个数据库级别的语句,因此它不会授予任何全局权限,例如FILE。 授予ALL不会分配GRANT OPTION或PROXY权限。


如果存在object_type子句,随后对象是表,存储函数或存储过程时,应将其指定为TABLE,FUNCTION或PROCEDURE。


用户对数据库,表,列或例程拥有的权限是作为每个权限级别的帐户权限的逻辑OR而形成的。 例如,如果用户具有全局SELECT权限,则无法在数据库,表或列级别以缺少权限来拒绝该权限。


MySQL使您能够授予不存在的数据库或表的权限。 对于表,要授予的权限必须包含CREATE权限。 此行为是有意设计的,旨在使数据库管理员能够为将要在稍后创建的数据库或表准备用户帐户和权限。


重要:

删除数据库或表时,MySQL不会自动撤消任何权限。 但是,如果删除例程,则为该例程授予的任何例程级特权都将被撤销。


账户名和密码

GRANT语句中的用户值指示该语句适用的MySQL帐户。 为了适应从任意主机向用户授予权限,MySQL支持以'user_name'@'host_name'的形式指定用户值。


您可以在主机名称中指定通配符。 例如,'user_name'@'%.example.com'适用于http://example.com域中任何主机的user_name,'user_name'@'198.51.100.%'适用于用户名198.51.100中的任何主机 C类子网。


简单形式'user_name'是'user_name'@'%'的同义词。


MySQL不支持用户名中的通配符。 要引用匿名用户,请使用GRANT语句指定具有空用户名的帐户:


GRANT ALL ON test.* TO ''@'localhost' ...;


在这种情况下,任何使用匿名用户的正确密码从本地主机连接的用户都将被允许访问,且具有与匿名用户帐户相关的权限。


为避免刚描述的问题,请使用以下语句删除本地匿名用户帐户:

DROP USER ''@'localhost';


对于允许auth_option值跟随user值的GRANT语法,auth_option以IDENTIFIED开头,并通过指定帐户身份验证插件,凭据(例如密码)或两者来指示帐户如何进行身份验证。 auth_option子句的语法与CREATE USER语句的语法相同。


注意:

从MySQL 5.7.6开始,不推荐使用GRANT来定义帐户认证特性。 而是使用CREATE USER或ALTER USER建立或更改认证特征。 这个GRANT功能将在未来的MySQL版本中被删除。


当IDENTIFIED存在且您拥有全局授予权限(GRANT OPTION)时,即使该帐户存在并且已有密码,指定的任何密码都将成为该帐户的新密码。 如果没有IDENTIFIED,帐户密码保持不变。


全局权限


全局权限是管理的或适用于给定服务器上的所有数据库。 要分配全局权限,请使用ON *。*语法:


GRANT ALL ON *.* TO 'someuser'@'somehost';

GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';

CREATE TABLESPACE,CREATE USER,FILE,PROCESS,RELOAD,REPLICATION CLIENT,REPLICATION SLAVE,SHOW DATABASES,SHUTDOWN和SUPER权限是管理性的,只能在全局范围内授予。


其他权限可以授予全球或更具体的级别。


MySQL将全局权限存储在mysql.user系统表中。


数据库权限


数据库特权适用于给定数据库中的所有对象。 要分配数据库级权限,请使用ON db_name.*语法:

GRANT ALL ON mydb.* TO 'someuser'@'somehost';

GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';


如果使用ON *语法(而不是ON *.*),则会在数据库级别为默认数据库分配权限。 如果没有默认数据库,则会发生错误。


可以在数据库级别指定CREATE,DROP,EVENT,GRANT OPTION,LOCK TABLES和REFERENCES特权。 表或例程特权也可以在数据库级别指定,在这种情况下,它们适用于数据库中的所有表或例程。


MySQL将数据库权限存储在mysql.db系统表中。


表级别权限


表权限适用于给定表中的所有列。 要分配表级特权,请使用ON db_name.tbl_name语法:


GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';

GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';


如果您指定了tbl_name而不是db_name.tbl_name,则该语句将应用于默认数据库中的tbl_name。 如果没有默认数据库,则会发生错误。


表级允许的priv_type值为ALTER,CREATE VIEW,CREATE,DELETE,DROP,GRANT OPTION,INDEX,INSERT,REFERENCES,SELECT,SHOW VIEW,TRIGGER和UPDATE。


表级权限适用于基表和视图。 即使表名匹配,它们也不适用于使用CREATE TEMPORARY TABLE创建的表。


MySQL将表特权存储在mysql.tables_priv系统表中。


字段权限


列权限适用于给定表中的单个列。 在列级别授予的每个特权必须紧跟在括号内的一列或多列之后。


GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';


列的允许的priv_type值(即,当您使用column_list子句时)是INSERT,REFERENCES,SELECT和UPDATE。


MySQL将列权限存储在mysql.columns_priv系统表中。


存储例程权限


ALTER ROUTINE,CREATE ROUTINE,EXECUTE和GRANT OPTION权限适用于存储的例程(过程和函数)。 他们可以在全球和数据库级授予。 除CREATE ROUTINE外,这些特权可以在例程级授予各个例程。

GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';

GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';


例程级允许的priv_type值是ALTER ROUTINE,EXECUTE和GRANT OPTION。 CREATE ROUTINE不是例程级别的权限,因为您必须具有全局或数据库级别的权限才能创建例程。


MySQL在mysql.procs_priv系统表中存储例程级特权。


代理用户权限


PROXY权限使一个用户成为另一个用户的代理。 代理用户模拟或获取代理用户的身份; 也就是说,它假定代理用户的权限。


GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';


当授予PROXY时,它必须是GRANT语句中唯一指定的权限,不能给出REQUIRE子句,唯一允许的WITH选项是WITH GRANT OPTION。


代理要求代理用户通过插件进行认证,该插件在代理用户连接时将代理用户的名称返回给服务器,并且代理用户对代理用户具有PROXY权限


MySQL在mysql.proxies_priv系统表中存储代理权限。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3147160/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42262