一、错误提示
我们在安装好Oracle12c之后,需要进行用户的创建。
发生场景:
这里以创建一个用户名是SB,密码是 oscar , 默认的表空间是SB 为例(SB是自行创建的表空间)
create user SB identified by oscar default tablespace SB;
这个时候提示:
转到SQL Develop开发工具创建, 报相同的错误。
二、错误及原因
Oracle 12C 提出了多租户环境(Multitenant Environment)和容器(Container)的概念, 区分了两个层级:
CDB , Container Database, 数据库容器
PDB, Pluggable Database, 可插拔数据库
关系如下图:
在数据库中建立的用户对应以上两个层级:
COMMOM USERS , 普通用户, 一般建立在CDB层, 用户名需要以 C#或C##开头;
LOCAL USERS , 本地用户, 仅建立在PBD层,建立的时候需要指定容器
从上面的错误 “invalid common user or role name” 来看, COMMOM USERS 需要以 C#或C##开头, 所有这里的用户名不合规范。
那如何查看当前环境的所在的容器呢? 可以通过以下命令查看:
select sys_context ('USERENV', 'CON_NAME') from dual;
这里查看的结果如下:
当前所在的是CDB容器。
解决方法:
解决方法有两种:
如果确定需要创建在CDB容器中, 则在用户名前面加C#或C## (最好是加上C##, 部分环境加C#会不行)
如果想保持原用户名,可以将用户创建到PDB容器中
创建用户到PDB步骤:
1.查看pdb 容器信息
select con_id,dbid,NAME,OPEN_MODE from v$pdbs;
查询结果如下:
2.打开PDBORCL 数据库
alter pluggable database ORCLPDB open;
注意: 这个命名需要使用sysdba账号执行才有权限
sqlplus / as sysdba
#如果是以sysdba登陆的就可以直接操作。
3.再次使用 select con_id,dbid,NAME,OPEN_MODE from v$pdbs; 命令, 可以发现ORCLPDB 的OPEN_MODEL 从MOUNTED (已挂载)变成 READ WRITE(可以读写)了。
4.切换当前Session到 ORCLPDB容器
alter session set container=ORCLPDB;
切换后, 可以使用 select sys_context ('USERENV', 'CON_NAME') from dual; 查看是否切换成功。
5.切换成功后再创建用户就可以了。需要注意,该用户对应的表空间也必须在ORCLPDB 中。
三、一句话总结
Oracle 12c创建用户要么以C##开头, 要么切换到PDB容器创建。