跳到主要内容

直接授予权限

您可以通过 GRANT 语句直接授予用户权限。

前提条件

当前用户必须拥有被授予的权限(例如,test1 把表 t1SELECT 权限授予 test2,则 test1 必须拥有表 t1SELECT 的权限),并且拥有 GRANT OPTION权限,才能授予成功。

查看当前拥有权限的操作请参见 查看用户权限

注意事项

进行授权前,需要注意以下事项:

  • 给特定用户授予权限时,如果用户不存在,可以直接创建用户。如果 sql_mode='no_auto_create_user',且语句中没有 IDENTIFIED BY 指定密码时,不可以直接创建用户。

  • 同时把多个权限赋予用户时,权限类型用英文逗号(,)分隔。

  • 同时给多个用户授权时,用户名用英文逗号(,)分隔。

  • 用户被授权后,该用户只有重新连接 seekdb,权限才能生效。

授予权限的语法

授予权限的语法如下:

GRANT priv_type 
    ON priv_level
    TO user_specification [, user_specification]...
[WITH GRANT OPTION];

priv_level:
*
| *.*
| database_name.*
| database_name.table_name
| table_name
| database_name.routine_name

user_specification:
user_name [IDENTIFIED BY [PASSWORD] 'password']

语句使用说明:

  • priv_type:指定授予的权限类型。同时将多个权限授予用户时,权限类型之间使用英文逗号(,)分隔。

    如果需要授予列级权限,则需要在对应的权限类型后指定列名(格式为 priv(col_list)),支持同时指定多列,列名之间使用英文逗号间隔。例如,授予 c1 列的 SELECT 权限,则表示为 SELECT(c1)

    在为表选择列进行授权时:

    • 如果需要对某些列执行 UPDATE 语句,则需要授予用户这些列的 UPDATE 权限,以及其他要访问的列的 SELECT 权限。

      例如,对于以下语句:

      UPDATE tb1 SET c1=c3, c2=1+3 WHERE c4=1;

      由于需要更新的列是 c1c2,则需要对用户授予 c1c2 列的 UPDATE 权限;同时又需要访问 c3c4 列,故还需要对用户授予 c3c4 列的 SELECT 权限。

    • 如果需要对某些列执行 INSERT 语句或 REPLACE 语句,则需要授予用户插入数据的这些列的 INSERT 权限,以及其他要访问的列的 SELECT 权限。

    • 对于其他语句,需要访问哪些列就授予用户哪些列的 SELECT 权限即可。

    有关 MySQL 模式支持的所有权限类型,请参见 权限分类

  • priv_level:指定授予权限的层级。权限主要分为以下层级:

    • 全局:适用于所有的数据库。使用 GRANT ... ON *.* 授予全局权限。

    • 数据库层级:适用于指定一个数据库中的所有目标。使用 GRANT ... ON db_name.* 授予数据库级权限。

    • 表层级:适用于指定一个表中的所有列。使用 GRANT ... ON database_name.table_name 授予表级权限。

      授予列权限时,也使用 GRANT ... ON database_name.table_name 来表示指定的表。

  • user_specification:指定待授予权限的用户。如果用户不存在,则直接创建用户。

    同时授权给多个用户时,用户名之间使用英文逗号(,)分隔。

  • user_name IDENTIFIED BY 'password'user_name IDENTIFIED BY PASSWORD 'password'user_name IDENTIFIED BY 'password' 子句中的密码为明文;user_name IDENTIFIED BY PASSWORD 'password' 子句中的密码为密文。

  • WITH GRANT OPTION:指定权限是否允许转授或撤销。

操作示例

  • 授予全局权限

    该权限适用于所有数据库。通常使用 GRANT ... ON *.* 授予全局权限。

    • 将所有数据库的所有对象的权限授予用户 test

      GRANT ALL ON *.* TO test;
    • 将所有数据库中所有表的 INSERTSELECT 权限授予用户 test

      GRANT SELECT, INSERT ON *.* TO test;
  • 授予数据库级权限

    数据库级权限是指某个指定的数据库中所有对象的操作权限。通常使用 GRANT ... ON db_name.* 授予数据库级权限。

    • 将数据库 db1 的所有对象的操作权限授予用户 test

      GRANT ALL ON db1.* TO test;
    • 将数据库 db1 的所有表的 INSERTSELECT 权限授予用户 test

      GRANT SELECT, INSERT ON db1.* TO test;
  • 授予表级权限

    对象权限是指某个指定的数据库中的指定表的操作权限。通常使用 GRANT ... ON db_name.tb1_name 授予对象权限。

    • 将数据库 db1 的表 tb1_nameINSERTSELECT 权限授予用户 test

      GRANT SELECT, INSERT ON db1.tb1_name TO test; 
    • 将数据库 db1 的表 tb1_name 的操作权限授予用户 test

      GRANT ALL ON db1.tb1_name TO test;
  • 授予表中的列权限

    列权限是指对某个指定表的指定列的操作权限。

    以下示例中,将数据库 db1 下表 tb1_namec1 列的 SELECT 权限以及 c1c2 列的 INSERT 权限授予用户 test

    GRANT SELECT(c1), INSERT (c1, c2) ON db1.tb1_name TO test;

更多 GRANT 语句的信息请参见 GRANT