Oracle数据库在12c之后版本由pdb机制引起的用户建立等问题的解决方案

现在很多的教程还是用的是Oracle 11c之前的版本(或者是对应的xe版本)但是由于pdb机制的引入,导致刚开始的时候创建用户等操作出现了问题,折腾了一小时后找到解决方法,在此记录一下(版本为18c的XE版本)

创建用户失败

1.解决方法

首先是登入以sysdba的权限登入system账户(以SQL Plus为例)
conn system/密码 as sysdba;
然后是查看查看sysdba下所有PDB以及服务名
select name,pdb from v$services;

找到非CDB$ROOT的PDB,记下上面那行为NAME,下面那行是PDB(就像输出结果的头一样),我这NAME为xepdb1,PDB为XEPDB1

然后先执行一次alter pluggable database xepdb1 open(命令中的xepdb1请自行替换),确保pdb已经开了

然后是切换到那个pdb,执行
alter session set container=xepdb1;(命令中的xepdb1请自行替换)

创建用户(这里就和之前版本的创建命令一致了)
create user scott identified by bjsxt;

授权grant connect to scott;
grant resourse to scott;
alter user scott quota unlimited on users;

创建完成后我们需要修改监听文件tnsnames.ora和listener.ora后才能登录(在$ORACLE_HOME/network/admin下,$ORACLE_HOME目录根据版本的不同而不同,我的是在安装目录下的dbhomeXE中)

tnsnames.ora文件,我选择将原有的复制了一份,修改了名字和SERVICE_NAME项,名字可以随意,但是SERVICE_NAME项必须是上面复制的pdb的NAME

然后是修改listener.ora,同样的,将原有的listener复制一份,修改SID_NAME为之前复制的pdb的NAME

保存文件,回到客户端
(用PL/SQL Developer的同学需要重启一下客户端才能看到新的配置,当然直接打名字也行)

登录conn scott/bjsxt@xepdb1(xepdb1为之前记下 的PDB)

换成PL/SQL Developer就是这样

之后如果需要对创建的普通用户管理,最好直接通过这个pdb登录system,否则每次都需要像之前一样切换pdb,否则找不到这个普通用户

##小结
问题最开始主要体现在“ORA-65096: 公用用户名或角色名无效”这个错误上,网络上很多的解决方法都是在用户名前面加上C##的前缀来解决,但是这样建立出来的账户与11c及之前版本创立出来的用户是有很大不同的。

按照我的理解来做个比喻:原来11c之前的版本,是一栋住一户人家的平房,创建的用户就是管理这户人家的管理员,而现在的版本,这户平房的人家搬进了一个公寓,这个公寓可以有很多像这个人家一样的住户,而直接加C##创建的一般用户,相当于整个公寓的管理员,而pdb中创建的本地用户才是像之前版本那样的管理员

当然,这只是一个初学者的理解,望大佬指正

参考博客:https://www.cnblogs.com/caoyt/p/9808547.html
http://blog.itpub.net/9034054/viewspace-2055714/
https://blog.csdn.net/qq877507054/article/details/81209967