集群中创建用户(Oracle 模式)步骤

创建用户(Oracle 模式)

在 Oracle 模式下创建一个用户。

权限要求

数据库在运行过程中,往往需要创建不同的用户,并为用户赋予相应的权限,一般被授予 CREATE USER 权限的用户可以创建用户。

由于 CREATE USER 权限较大,默认仅集群管理员和租户管理员拥有此系统权限,其他用户如果需要创建用户,则需要被授予 CREATE USER 权限,授权相关操作请参见 修改用户权限

用户名称的规则

为用户指定名称时,需要注意以下限制:

  • 用户名的唯一性:每个用户名需要保证在租户内唯一。

用户名称在租户内是唯一的,不同租户下的用户可以同名,故通过 用户名@租户名 的形式可以在系统全局唯一定位一个租户用户。

由于系统租户与 MySQL 租户属于同一兼容模式 ,为区别系统租户和普通租户下的用户,建议对系统租户下的用户名称使用特定前缀。

  • 用户名的命名约定:

    • 使用 OBClient 、ODC 等客户端创建用户时,要求用户名长度不超过 64 个字节
    • 使用 OCP 创建用户时,要求用户名以英文字母开头,可包含大写字母、小写字母、数字和下划线,且长度为 2~64 个字符。

连接集群

使用 root 用户登录 obcluster 集群的 Oracle 模式租户 oracle_tenant

obclient -h127.0.0.1 -P2883 -usys@oracle_tenant#obcluster -A  

创建一个拥有最小数据库权限的用户和拥有超级权限的用户

可以使用 CREATE USER 语句创建用户。创建用户必须拥有 CREATE USER 的系统权限。在创建用户时,建议坚持最小权限原则,即所有用户只拥有执行其任务所需的最小权限。

创建一个拥有最小数据库权限的用户

创建一个拥有最小数据库权限的用户 test2 的示例如下。

创建用户 test

CREATE USER test IDENTIFIED BY 123456;

授予用户 test2 连接数据库的权限

GRANT CREATE SESSION TO test;

查看已创建的用户

select USERNAME,USERID,CREATED,LAST_LOGIN from sys.dba_users WHERE username='TEST';

输出结果如下:

obclient(SYS@oracle_tenant)[SYS]> select USERNAME,USERID,CREATED,LAST_LOGIN from sys.dba_users WHERE username='TEST';
+----------+--------+-----------+------------+
| USERNAME | USERID | CREATED   | LAST_LOGIN |
+----------+--------+-----------+------------+
| TEST     | 500002 | 19-SEP-25 | NULL       |
+----------+--------+-----------+------------+
1 row in set (0.048 sec)

创建一个 DBA 用户

创建用户 dba_test

CREATE USER dba_test IDENTIFIED BY 123456;

授予用户 dba_test 超级权限

GRANT dba TO dba_test;

查看用户权限

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

场景1:查看某个用户被授予的系统权限

管理员可以通过 DBA_SYS_PRIVS 视图查看某个用户被授予的系统权限。

SELECT * FROM DBA_SYS_PRIVS WHERE grantee='TEST';

输出结果如下:

+---------+----------------+--------------+
| GRANTEE | PRIVILEGE      | ADMIN_OPTION |
+---------+----------------+--------------+
| TEST    | CREATE SESSION | NO           |
+---------+----------------+--------------+
1 row in set (0.028 sec)

场景2:查看当前用户被授予的系统权限

普通用户和管理员都可以通过 USER_SYS_PRIVS 视图查看自己被授予的系统权限。

SELECT * FROM USER_SYS_PRIVS ;

输出结果如下:

obclient(SYS@oracle_tenant)[SYS]> SELECT * FROM USER_SYS_PRIVS ;
+----------+-----------------------------+--------------+
| USERNAME | PRIVILEGE                   | ADMIN_OPTION |
+----------+-----------------------------+--------------+
| SYS      | CREATE SESSION              | YES          |
| SYS      | CREATE TABLE                | YES          |
| SYS      | CREATE ANY TABLE            | YES          |
| SYS      | ALTER ANY TABLE             | YES          |
| SYS      | BACKUP ANY TABLE            | YES          |
| SYS      | DROP ANY TABLE              | YES          |
| SYS      | LOCK ANY TABLE              | YES          |
| SYS      | COMMENT ANY TABLE           | YES          |
.....

场景3:查看某个用户被授予的对象权限

管理员可以通过 DBA_TAB_PRIVS 视图查看某个用户被授予的对象权限。

SELECT * FROM DBA_TAB_PRIVS ;

输出结果如下:

obclient(SYS@oracle_tenant)[SYS]> SELECT * FROM DBA_TAB_PRIVS ;
+---------------------+-------+---------------------+---------+-----------+-----------+-----------+
| GRANTEE             | OWNER | TABLE_NAME          | GRANTOR | PRIVILEGE | GRANTABLE | HIERARCHY |
+---------------------+-------+---------------------+---------+-----------+-----------+-----------+
| STANDBY_REPLICATION | SYS   | DBA_OB_TENANTS      | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | DBA_OB_LS_HISTORY   | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | GV$OB_UNITS         | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | GV$OB_PARAMETERS    | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | GV$OB_LOG_STAT      | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | DBA_OB_LS           | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | DBA_OB_ACCESS_POINT | SYS     | SELECT    | NO        | NO        |
+---------------------+-------+---------------------+---------+-----------+-----------+-----------+
7 rows in set (0.115 sec)

场景4:查看当前用户被授予的对象权限

普通用户和管理员都可以通过 USER_TAB_PRIVS 视图查看当前自己被授予的对象权限。

SELECT * FROM USER_TAB_PRIVS;

输出信息如下:

obclient(SYS@oracle_tenant)[SYS]> SELECT * FROM USER_TAB_PRIVS;
+---------------------+-------+---------------------+---------+-----------+-----------+-----------+
| GRANTEE             | OWNER | TABLE_NAME          | GRANTOR | PRIVILEGE | GRANTABLE | HIERARCHY |
+---------------------+-------+---------------------+---------+-----------+-----------+-----------+
| STANDBY_REPLICATION | SYS   | DBA_OB_TENANTS      | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | DBA_OB_LS_HISTORY   | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | GV$OB_UNITS         | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | GV$OB_PARAMETERS    | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | GV$OB_LOG_STAT      | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | DBA_OB_LS           | SYS     | SELECT    | NO        | NO        |
| STANDBY_REPLICATION | SYS   | DBA_OB_ACCESS_POINT | SYS     | SELECT    | NO        | NO        |
+---------------------+-------+---------------------+---------+-----------+-----------+-----------+
7 rows in set (0.074 sec)

场景5:查看某个用户所拥有的角色。

管理员可以通过 DBA_ROLE_PRIVS 视图查看某个用户所拥有的角色。

SELECT * FROM DBA_ROLE_PRIVS;

输出结果如下:

obclient(SYS@oracle_tenant)[SYS]> SELECT * FROM DBA_ROLE_PRIVS;
+----------+--------------+--------------+--------------+
| GRANTEE  | GRANTED_ROLE | ADMIN_OPTION | DEFAULT_ROLE |
+----------+--------------+--------------+--------------+
| DBA_TEST | DBA          | NO           | YES          |
+----------+--------------+--------------+--------------+
1 row in set (0.022 sec)

场景6:查看当前用户被授予的角色

管理员和普通用户都可以通过 USER_ROLE_PRIVS 视图查看自己被授予的角色。

SELECT * FROM USER_ROLE_PRIVS;

输出结果如下:

当前无被授予的角色,返回空

obclient(SYS@oracle_tenant)[SYS]> SELECT * FROM USER_ROLE_PRIVS;
Empty set (0.014 sec)
1 个赞

普通用户只给了session角色有些不太够吧

1 个赞