GRANT

You are viewing an old version of this article. View the current version here.

语法

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_specification [ user_options ...]

user_specification:
  username [authentication_option]
  | PUBLIC
authentication_option:
  IDENTIFIED BY 'password' 
  | IDENTIFIED BY PASSWORD 'password_hash'
  | IDENTIFIED {VIA|WITH} authentication_rule [OR authentication_rule  ...]

authentication_rule:
    authentication_plugin
  | authentication_plugin {USING|AS} 'authentication_string'
  | authentication_plugin {USING|AS} PASSWORD('password')

GRANT PROXY ON username
    TO user_specification [, user_specification ...]
    [WITH GRANT OPTION]

GRANT rolename TO grantee [, grantee ...]
    [WITH ADMIN OPTION]

grantee:
    rolename
    username [authentication_option]

user_options:
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH with_option [with_option] ...]

object_type:
    TABLE
  | FUNCTION
  | PROCEDURE
  | PACKAGE

priv_level:
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name

with_option:
    GRANT OPTION
  | resource_option

resource_option:
  MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
  | MAX_STATEMENT_TIME time

tls_option:
  SSL 
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'

描述

GRANT 语句允许您授予账户特权或角色。要使用GRANT,您必须拥有GRANT OPTION特权,并且您必须拥有您正在授予的特权。

使用REVOKE语句撤销使用GRANT语句授予的特权。

使用SHOW GRANTS语句确定账户拥有哪些特权。

账户名称

对于GRANT语句,账户名称是指与CREATE USER语句相同的方式中的username参数。有关指定账户名称的详细信息,请参阅CREATE USER页面上的账户名称

隐式账户创建

GRANT语句还允许您在某些情况下隐式创建账户。

如果该账户尚不存在,则GRANT可以隐式创建它。要使用GRANT隐式创建账户,需要用户具有与使用CREATE USER语句显式创建账户所需的相同特权。

如果设置了NO_AUTO_CREATE_USERSQL_MODE,则只有在指定了身份验证信息或使用CREATE USER语句时才能创建账户。如果未提供身份验证信息,则当指定的账户不存在时,GRANT将产生错误,例如:

show variables like '%sql_mode%' ;
+---------------+--------------------------------------------+
| Variable_name | Value                                      |
+---------------+--------------------------------------------+
| sql_mode      | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+--------------------------------------------+

GRANT USAGE ON *.* TO 'user123'@'%' IDENTIFIED BY '';
ERROR 1133 (28000): Can't find any matching row in the user table

GRANT USAGE ON *.* TO 'user123'@'%' 
  IDENTIFIED VIA PAM using 'mariadb' require ssl ;
Query OK, 0 rows affected (0.00 sec)
 
select host, user from mysql.user where user='user123' ;

+------+----------+
| host | user     |
+------+----------+
| %    | user123 |
+------+----------+

权限级别

权限可以设置全局、整个数据库、表或例程,也可以为表中的单个列设置权限。某些权限只能在特定级别设置。

全局权限不会立即生效,只会应用于在执行GRANT语句之后创建的连接。

  • 全局权限 priv_type 使用*.*priv_level授予。全局权限包括管理数据库和管理用户帐户的权限,以及所有表、函数和过程的权限。全局权限存储在MariaDB 10.4之前的mysql.user表中,在之后存储在mysql.global_priv表中。
  • 数据库权限 priv_type 使用db_name.*priv_level授予,或者使用*使用默认数据库。数据库权限包括创建表和函数的权限,以及数据库中所有表、函数和过程的权限。数据库权限存储在mysql.db表中。
  • 表权限 priv_type 使用db_name.tbl_namepriv_level授予,或者使用tbl_name指定默认数据库中的表。TABLE关键字是可选的。表权限包括选择和更改表中的数据的能力。可以为单个列授予某些表权限。
  • 列权限 priv_type 通过为priv_level指定表并在特权类型后提供列列表来授予。它们允许您精确控制用户可以选择和更改哪些表中的列。
  • 函数权限 priv_type 使用FUNCTION db_name.routine_namepriv_level授予,或者只需使用FUNCTION routine_name指定默认数据库中的函数。
  • 过程权限 priv_type 使用PROCEDURE db_name.routine_namepriv_level授予,或者只需使用PROCEDURE routine_name指定默认数据库中的过程。

USAGE 权限

USAGE 权限没有实际的特权。SHOW GRANTS 语句将显示一个新创建用户的全局 USAGE 权限。您可以使用 GRANT 语句中的 USAGE 权限来更改选项,例如 GRANT OPTIONMAX_USER_CONNECTIONS,而不更改任何帐户特权。

ALL PRIVILEGES 权限

ALL PRIVILEGES 权限授予所有可用权限。授予所有权限仅影响给定的特权级别。例如,在表上授予所有权限不会授予数据库或全局任何权限。

使用 ALL PRIVILEGES 不授予特殊的 GRANT OPTION 权限。

您可以使用 ALL 而不是 ALL PRIVILEGES

GRANT OPTION 权限

使用 WITH GRANT OPTION 子句赋予用户在给定特权级别上授予权限给其他用户的能力。具有 GRANT OPTION 权限的用户只能授予他们拥有的权限。他们不能授予高于他们拥有 GRANT OPTION 特权级别的权限。

不能为单个列设置 GRANT OPTION 权限。如果在指定 列权限 时使用 WITH GRANT OPTION,则会为整个表授予 GRANT OPTION 权限。

使用 WITH GRANT OPTION 子句等效于将 GRANT OPTION 列出为特权。

全局特权

下表列出了可以全局授予的特权。您还可以全局授予所有数据库、表和函数特权。当全局授予这些特权时,这些特权适用于所有数据库、表或函数,包括稍后创建的那些。

要设置全局特权,请使用 *.* 作为 priv_level

BINLOG ADMIN

启用 二进制日志 的管理,包括 PURGE BINARY LOGS 语句和设置以下系统变量:

MariaDB 10.5.2 开始添加。

Comments

Comments loading...
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.