开发者社区> 问答> 正文

云数据库 OceanBase的用户及权限管理

数据库用户权限管理包括新建用户、删除用户、修改密码、修改用户名、锁定用户、用户授权和撤销授权等。
OceanBase 1.0中用户分为两类:系统租户下的用户,一般租户下的用户。创建用户时,如果Session当前租户为系统租户,则新建的用户为系统租户下的用户,反之为一般租户下的用户。
用户名称在租户内是唯一的,不同租户下的用户可以同名。用户名@租户名在系统全局唯一。为区别系统租户和一般租户下的用户,系统租户下的用户名称使用特定前缀。系统租户和普通租户都有一个内置用户root,系统租户的root为系统管理员和普通租户的root为租户管理员,购买了某个普通租户的客户得到普通租户root和密码,进行本租户范围的管理工作。
一般租户下的用户只能拥有该租户下对象的访问权限,权限和MySQL兼容;系统租户下的用户可以被授予跨租户的对象访问权限。当前系统租户下的用户不允许访问一般租户下的用户表数据。用户在登录OceanBase系统时需指定唯一的租户名。对于系统租户下的用户,在登录后,可以使用CHANGE EFFECTIVE TENANT tenantname语句来切换当前访问的租户;对于一般租户下的用户,不能切换到其他租户。

新建用户


CREATE USER用于创建新的OceanBase用户。创建新用户后,可以使用该用户连接OceanBase。
格式 CREATE USER user_specification_list;
user_specification_list:
    user_specification [, user_specification]…;
user_specification:
    user IDENTIFIED BY 'authstring'
    user IDENTIFIED BY PASSWORD 'hashstring'

  • 必须拥有全局的CREATE USER权限,才可以使用CREATE USER命令。
  • 新建用户后,“mysql.user”表会新增一行该用户的表项。如果同名用户已经存在,则报错。
  • 使用自选的IDENTIFIED BY子句,可以为账户给定一个密码。
  • user IDENTIFIED BY ‘authstring’此处密码为明文,存入“mysql.user”表后,服务器端会变为密文存储。
  • user IDENTIFIED BY PASSWORD ‘hashstring’此处密码为密文。
  • 同时创建多个用户时,用“,”隔开。

举例 Oceanbase>CREATE USER 'sqluser01' IDENTIFIED BY '123456', 'sqluser02' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.07 sec)
Oceanbase>select user from user;
+-----------+
| user      |
+-----------+
| root      |
| test      |
| sqluser01 |
| sqluser02 |
+-----------+
4 rows in set (0.01 sec)



删除用户


DROP USER语句用于删除一个或多个OceanBase用户。
格式 DROP USER username [, username...];

  • 必须拥有全局的CREATE USER权限,才可以使用DROP USER命令。

  • 不能对“mysql.user”表进行DELETE方式进行权限管理。

  • 成功删除用户后,这个用户的所有权限也会被一同删除。

  • 同时删除多个用户时,用“,”隔开。

举例
执行以下命令,删除“sqluser02”用户。 DROP USER 'sqluser02';


修改密码


修改OceanBase登录用户的密码。
格式 SET PASSWORD [FOR user] = password_option;
password_option: {
    PASSWORD('authstring')
    |'hashstring'}


或者 ALTER USER username IDENTIFIED BY 'password';

  • 如果没有For user子句,则修改当前用户的密码。任何成功登录的用户都可以修改当前用户的密码。

  • 如果有For user子句,或使用第二种语法,则修改指定用户的密码。必须拥有全局CREATE USER权限,才可以修改指定用户的密码。

举例
执行以下命令将“sqluser01”的密码修改为“abc123”。 ALTER USER sqluser01 IDENTIFIED BY 'abc123';

使用 SET PASSWORD修改密码如下: Oceanbase>set password for test = password('abc123');
Query OK, 0 rows affected (0.03 sec)
# 不指定password函数,会报错如下:
Oceanbase>set password for test = 'abc123';
ERROR 1827 (42000): The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.



修改用户名


用于修改OceanBase登录用户的用户名。
格式 RENAME USER
    'oldusername' TO 'newusername'
    [,'oldusername' TO 'newusername'...];


  • 必须拥有全局CREATE USER权限,才可以使用本命令。

  • 同时修改多个用户名时,用“,”隔开。

  • 修改前后,新旧用户权限保持一致。

  • 用户名长度限制:用户名占用字节小于等于16。

举例 Oceanbase>select user from user;
+---------+
| user    |
+---------+
| root    |
| testall |
+---------+
2 rows in set (0.00 sec)


修改用户名 Oceanbase>rename user testall to test;
Query OK, 0 rows affected (0.03 sec)
Oceanbase>select user from user;
+------+
| user |
+------+
| root |
| test |
+------+
2 rows in set (0.00 sec)



锁定用户


锁定或者解锁用户。被锁定的用户不允许登录。
格式 ALTER USER user [lock_option]
lock_option:{
    ACCOUNT LOCK
    | ACCOUNT UNLOCK}


必须拥有全局UPDATE USER权限,才可以执行本命令。
举例
锁定用户 Oceanbase>alter user test account lock;
Query OK, 0 rows affected (0.04 sec)


解锁用户 Oceanbase>alter user test account unlock;
Query OK, 0 rows affected (0.02 sec)



用户授权


GRANT语句用于系统管理员授予User某些权限。
格式 GRANT priv_type
    ON priv_level
    TO user_specification [, user_specification]...
    [WITH with_option ...]
priv_level:
     *
    | *.*
    | db_name.*
    | db_name.tbl_name
    | tbl_name
user_specification:
    user [IDENTIFIED BY [PASSWORD] ‘password’]
with_option:
     GRANT OPTION


权限可以分为以下几个层级:
全局层级:适用于所有的数据库。使用GRANT ALL ON *.*授予全局权限。
数据库层级:适用于一个给定数据库中的所有目标。使用GRANT ALL ON db_name.*授予数据库权限。
表层级:表权限适用于一个给定表中的所有列。使用GRANT ALL ON db_name.tbl_name授予表权限。

  • 给特定用户授予权限。如果用户不存在,可以直接创建用户。(sql_mode=’no_auto_create_user’,同时没有identified by指定密码时候,不可以直接创建用户。)

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

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

  • 用“*”代替table_name,表示赋予全局权限,即对数据库中的所有表赋权。

  • 同时把多个权限赋予用户时,权限类型用“,”隔开。

  • 同时给多个用户授权时,用户名用“,”隔开。

  • priv_type的值如下表所示。
权限说明
ALL PRIVILEGES除GRANT OPTION以外所有权限。
ALTERALTER TABLE的权限。
CREATECREATE TABLE的权限。
CREATE USERCREATE USER,DROP USER,RENAME USER和REVOKE ALL PRIVILEGES的权限。
CREATE TABLEGROUP全局CREATE TABLEGROUP的权限。
DELETEDELETE的权限。
DROPDROP的权限。
GRANT OPTIONGRANT OPTION的权限。
INSERTINSERT的权限。
SELECTSELECT的权限。
UPDATEUPDATE的权限。
SUPERSET GLOBAL修改全局系统参数的权限。
SHOW DATABASES全局 SHOW DATABASES的权限。
INDEXCREATE INDEX, DROP INDEX的权限
CREATE VIEW创建、删除视图的权限
SHOW VIEWSHOW CREATE VIEW权限

说明:目前没有change effective tenant的权限控制,sys租户下的用户都可以。

撤销权限


REVOKE语句用于系统管理员撤销User某些权限。
格式 REVOKE priv_type
     ON database.tblname
    FROM 'user';


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

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

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

  • 用“*”代替table_name,表示撤销全局权限,即撤销对数据库中所有表的操作权限。

  • 同时对用户撤销多个权限时,权限类型用“,”隔开。

  • 同时撤销多个用户的授权时,用户名用“,”隔开。

  • priv_type的值如上表所示。

举例
执行以下命令撤销“obsqluser01”的所有权限。 REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'obsqluser01';


查看权限


SHOW GRANTS语句用于系统管理员查看User的操作权限。
格式
  1. SHOW GRANTS [FOR username];SHOW GRANTS [FOR username];

  • 如果不指定用户名,则缺省显示当前用户的权限。对于当前用户,总可以查看自己的权限。
  • 如果要查看其他指定用户的权限,必须拥有对“mysql.user”的SELECT权限。

举例 Oceanbase>show grants for test;
+------------------------------+
| Grants for test              |
+------------------------------+
| GRANT USAGE ON *.* TO 'test' |
+------------------------------+
1 row in set (0.01 sec)

展开
收起
云栖大讲堂 2017-11-01 16:11:25 5772 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
开源HTAP OceanBase产品揭秘 立即下载
云数据库OceanBase 架构演进及在金融核心系统中的实践 立即下载
自研金融数据库OceanBase的创新之路 立即下载