OceanBase学习之路27|如何查看及修改用户权限?

用户创建成功后,您可以根据需要查看用户的权限。

通过 SQL 语句查看用户权限

  1. 管理员登录数据库的 MySQL 租户。

  2. 通过以下方式查看用户权限:

    • 通过  SHOW GRANTS 语句查看某个用户被授予的权限。

      示例如下:

      obclient> SHOW GRANTS FOR test;
      +----------------------------------------+
      | Grants for test@%                     |
      +----------------------------------------+
      | GRANT INSERT, SELECT ON *.* TO 'test' |
      | GRANT SELECT ON `db1`.* TO 'test'     |
      +----------------------------------------+
      2 rows in set
    • 查看用户所拥有的用户级权限。

      管理员可以通过  mysql.user 视图查看某个用户所拥有的用户级权限。普通用户可以通过  mysql.user 视图查看自己所拥有的用户级权限。

      示例如下:

      obclient> SELECT * FROM mysql.user WHERE user='test'\G;
      *************************** 1. row ***************************
                        host: %
                        user: test
                    password: *6691484ea6b50ddde1926a220da01fa9e575c18a
                 select_priv: Y
                 insert_priv: Y
                 update_priv: N
                 delete_priv: N
                 create_priv: N
                   drop_priv: N
                 reload_priv: N
               shutdown_priv: N
                process_priv: N
                   file_priv: N
                  grant_priv: N
              reference_priv: N
                  index_priv: N
                  alter_priv: N
                show_db_priv: N
                  super_priv: N
       create_tmp_table_priv: N
            lock_tables_priv: N
                execute_priv: N
             repl_slave_priv: N
            repl_client_priv: N
            create_view_priv: N
              show_view_priv: N
         create_routine_priv: N
          alter_routine_priv: N
            create_user_priv: N
                  event_priv: N
                trigger_priv: N
      create_tablespace_priv: N
                    ssl_type: 
                  ssl_cipher: 
                 x509_issuer: 
                x509_subject: 
               max_questions: 0
                 max_updates: 0
             max_connections: 0
        max_user_connections: 0
                      plugin: ob_native_password
       authentication_string: 
            password_expired: 
      1 row in set

      更多  mysql.user 视图的字段及说明请参见  mysql.user

    • 查看用户所拥有的数据库级权限。

      管理员可以通过  mysql.db 视图查看某个用户所拥有的数据库级权限。普通用户可以通过  mysql.db 视图查看自己所拥有的数据库级权限。

      obclient> SELECT * FROM mysql.db WHERE user='test'\G;
      *************************** 1. row ***************************
                       host: %
                         db: test
                       user: test
                select_priv: Y
                insert_priv: Y
                update_priv: Y
                delete_priv: N
                create_priv: N
                  drop_priv: N
                 grant_priv: N
             reference_priv: N
                 index_priv: Y
                 alter_priv: Y
      create_tmp_table_priv: N
           lock_tables_priv: N
           create_view_priv: N
             show_view_priv: Y
        create_routine_priv: N
         alter_routine_priv: N
               execute_priv: N
                 event_priv: N
               trigger_priv: N
      1 row in set

      更多  mysql.db 视图的字段及说明请参见  mysql.db



修改用户权限包括授予用户权限和撤销用户权限。

通过 SQL 语句授予权限

您可以通过  GRANT 语句授予用户用户级权限、数据库级权限或对象权限。

前提条件

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

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

注意事项

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

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

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

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

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

  • 由于目前没有  CHANGE EFFECTIVE TENANT 的权限控制,故  sys 租户下的用户都可以进行授权。

授予权限的语法

授予权限的语法如下:

GRANT priv_type 
    ON priv_level 
    TO user_specification [, user_specification]... 
     [WITH GRANT OPTION];
privilege_type:
      ALTER
    | CREATE
    | CREATE USER
    | CREATE VIEW
    | DELETE
    | DROP
    | GRANT OPTION
    | INDEX
    | INSERT
    | PROCESS
    | SELECT
    | SHOW DATABASES
    | SHOW VIEW
    | SUPER
    | UPDATE
    | USAGE
    | CREATE SYNONYM
    
priv_level: 
      *
    | *.*
    | database_name.* 
    | database_name.table_name
    | table_name
    | database_name.rountine_name
user_specification: 
user_name [IDENTIFIED BY [PASSWORD] 'password']

语句使用说明:

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

  • priv_level:指定授予权限的层级。MySQL 模式中,权限主要分为以下层级:

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

    • 数据库层级:适用于指定一个数据库中的所有目标。使用  GRANT ... ON db_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

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

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

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

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

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

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

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

    • 将数据库  db1 的表  tb1_name 的  INSERT 、 SELECT 权限授予用户  test

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

      obclient> GRANT ALL ON db1.tb1_name TO test;

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

通过 SQL 语句撤销权限

前提条件

  • 当前用户必须拥有被撤销的权限(例如, test1 要撤销  test2 对表  t1 的  SELECT 权限,则  test1 必须拥有表  t1 的  SELECT权限),并且拥有  GRANT OPTION 权限。

  • 撤销  ALL PRIVILEGES 和  GRANT OPTION 权限时,当前用户必须拥有全局  GRANT OPTION 权限,或者对权限表的  UPDATE 及  DELETE 权限。

注意事项

  • 同时对某个用户撤销多个权限时,权限类型用英文逗号(,)隔开。

  • 同时撤销多个用户的授权时,用户名用英文逗号(,)隔开。

  • 撤销操作不会级联。例如,用户  test1 给  test2 授予了某些权限,撤回  test1 的权限不会同时也撤回  test2 的相应权限。

撤销权限的语法

撤销权限的语法如下:

REVOKE priv_type 
     ON priv_level 
     FROM 'user_name';
priv_type:
      ALTER
    | CREATE
    | CREATE USER
    | CREATE VIEW
    | DELETE
    | DROP
    | GRANT OPTION
    | INDEX
    | INSERT
    | PROCESS
    | SELECT
    | SHOW DATABASES
    | SHOW VIEW
    | SUPER
    | UPDATE
    | USAGE
priv_level: 
      *
    | *.*
    | database_name.* 
    | database_name.table_name
    | table_name
    | database_name.rountine_name

语句使用说明:

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

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

    • 用户层级:适用于所有的数据库。使用  REVOKE ... ON *.* 撤销用户级权限。

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

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

  • user_name:指定待撤销权限的用户,同时撤销多个用户的权限时,用户名之间使用英文逗号(,)分隔。

操作示例

  • 撤销用户级权限

    撤销用户  test 操作所有数据库中所有表的  INSERT 、 SELECT 权限。

    obclient> REVOKE SELECT, INSERT ON *.* FROM 'test';
  • 撤销数据库级权限

    撤销用户  test 操作数据库  db1 的所有表的  INSERT 、 SELECT 权限。

    obclient> REVOKE SELECT, INSERT ON db1 FROM 'test';
  • 撤销表级权限

    撤销用户  test 操作数据库  db1 的表  tb1_name 的  INSERT 、 SELECT 权限。

    obclient> REVOKE SELECT, INSERT ON db1.tb1_name FROM 'test';


请使用浏览器的分享功能分享到微信等