跳到主要内容

GRANT

描述

该语句用于给指定的用户或角色授予相应的权限,或者将角色授予用户或角色。

使用限制及注意事项

不支持循环 GRANT 操作。例如,角色 A 授予角色 B,角色 B 授予角色 C,则角色 C 授予角色 A 会报错。

权限要求

将对象权限授予用户权限要求

  • 执行 GRANT 语句时,当前用户必须拥有被授予的权限。例如,想要使用用户 user1 为用户 user2 授予表 tbl1SELECT 权限,则用户 user1 必须拥有表 tbl1SELECT 权限。

  • 执行 GRANT 语句时,当前用户需拥有 GRANT OPTION 权限。有关 seekdb 权限的详细介绍,参见 seekdb 的权限分类

信息

为用户授权后,该用户需重新连接 seekdb ,权限才能生效。

将角色授予用户或角色权限要求

  • 当前用户具备 SUPER 权限时,可以 GRANT 所有角色。
  • 将角色授予其他用户或角色时,当前用户必须拥有被授予的角色,并且拥有 ADMIN OPTION 权限,才能授权成功。查看当前用户所拥有的权限的相关操作请参见 查看用户权限

语法

将对象权限授予用户或角色

GRANT priv_type[(column_name_list)] [, priv_type[(column_name_list)] ...]
ON [object_type] priv_level
TO {user [, user...]}
[WITH GRANT OPTION];

column_name_list:
column_name [, column_name ...]

object_type:
TABLE
| FUNCTION
| PROCEDURE
| CATALOG

user:
user_or_role
| user_name IDENTIFIED [WITH auth_plugin] BY password
| user_name IDENTIFIED [WITH auth_plugin] BY PASSWORD password

user_or_role:
user_name | role_name

将角色授予用户或角色

GRANT role_name [, role_name ...]
TO user_or_role [, user_or_role ...]
[WITH ADMIN OPTION];

user_or_role:
user_name | role_name

参数解释

参数描述
priv_type指定授予的权限类型,可以授予多个权限,多个权限间使用英文逗号(,)隔开。具体的权限类型及其说明请参见 seekdb 的权限分类。注意:PROXY 参数当前版本仅记录该关键字语法,功能不生效。
column_name_list可选项,用于授予列级权限的列表,授予的权限仅作用于列出的列上。如果不指定,则权限适用于整个表或对象。详细介绍信息,参见 直接授予权限
object_type可选项,表示授权的对象类型(即权限应用的对象类型)。详细介绍可参见下文 object_type
priv_level指定授予权限的层级。具有以下格式:
  • 可以指定在所有数据库和所有表上生效(*.*)。
  • 指定数据库或指定表生效(db_name.**.table_name
  • 特定的数据库中特定的表生效(db_name.table_name
  • 权限应用的对象类型是 Catalog 时,需指定外部数据目录的名称(external_catalog_name)。
user指定要授予权限的用户,可以是一个或多个用户,多个用户间使用英文逗号(,)隔开。如果用户不存在,该语句会直接创建用户。
auth_plugin用于指定用户身份验证的方式,目前仅支持 mysql_native_password 身份验证插件。
BY password为待授权的用户指定一个密码,此处密码为明文,存入 mysql.user 表后,服务器端会变为密文存储下来。如果密码中包含特殊字符 ~!@#%^&*_-+=`|()[]:;',.?/,需使用英文引号(''"")包含。
BY PASSWORD password为待授权的用户指定一个密码,此处密码为密文,将直接存入 mysql.user 表。
WITH GRANT OPTION指定权限是否允许转授,取消授权时级联。
role_name指定角色的名称。
WITH ADMIN OPTION指定角色权限是否允许转授,取消授权时不级联。

object_type

提示

在使用 object_type 子句时,需要确保所指定的对象确实是对应的类型,否则将导致语法错误。

  • TABLE:表示权限应用的对象类型是表。

  • FUNCTION:表示权限应用的对象类型是函数。

  • PROCEDURE:表示权限应用的对象类型是存储过程。

  • CATALOG:表示权限应用的对象类型是 Catalog。

    信息

    seekdb 权限应用的对象类型引入 CATALOG

示例如下:

  • 授予 user001test 数据库下所有对象的 SELECT 权限,因为所指定的对象不是指定的类型,所以导致会报错。

    GRANT SELECT ON TABLE test.* TO user001;

    返回结果如下:

    ERROR 1144 (42000): Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used
  • 授予 user001test 数据库下表 tbl1SELECT 权限。

    GRANT SELECT ON TABLE test.tbl1 TO user001;
  • 授予 user002test 数据库下函数 calculate_salary 的执行权限。

    GRANT EXECUTE ON FUNCTION test.calculate_salary TO user002;
  • 授予 user003test 数据库下存储过程 pro_generate_data 的执行权限。

    GRANT EXECUTE ON PROCEDURE test.pro_generate_data TO user003;
  • 授予 user004 对 Catalog 的对象 test_odps_catalogSELECTUSE CATALOG 权限。

    GRANT SELECT, USE CATALOG ON CATALOG test_odps_catalog TO user004 WITH GRANT OPTION;

示例

示例一:授予对象权限

  • 为已存在的用户 user1 赋予数据库 db1CREATE VIEW 权限,并设置允许转授其他用户相同的权限。

    GRANT CREATE VIEW ON db1.* TO user1 WITH GRANT OPTION;
  • 为已存在的用户 user1 赋予数据库 db1CREATE 权限,并修改 user1 的密码。

    GRANT CREATE ON db1.* TO user1 IDENTIFIED by '********';

    执行后查看 mysql.user 表中 user1 用户的密码,会看到已更新为最新设置的密码。

  • 为不存在的用户 user2 赋予数据库 db1CREATE 权限,并为 user2 设置密码。

    GRANT CREATE ON db1.* TO user2 IDENTIFIED by '********';
  • 为已存在的用户 user001 赋予数据库 test 中的表 tbl1col1SELECT 权限。

    GRANT SELECT(col1) ON test.tbl1 TO user001;
  • 授予用户 user005 对全局级别的 CREATE CATALOGUSE CATALOG 权限。

    GRANT CREATE CATALOG, USE CATALOG ON *.* TO user004 WITH GRANT OPTION;

示例二:将角色授予用户或角色

  • 将角色 role001 的权限授予角色 role002,并且允许转授。

    GRANT role001 TO role002 WITH ADMIN OPTION;
  • 将角色 role001 的权限授予用户 user001,并且允许转授。

    GRANT role001 TO user001 WITH ADMIN OPTION;

相关文档