Oracle 19c无需每次执行alter session切换容器访问orclpdb表的方案咨询
Oracle 19c无需每次切换PDB访问数据的解决方法
问题原因说明
Oracle 12c及后续版本默认采用CDB多租户架构,你安装的Oracle 19c默认登录SQL Plus时连接的是根容器CDB$ROOT,你之前创建的用户、数据表都存储在可插拔数据库orclpdb中,因此退出重登后默认在根容器无法访问PDB内的资源。在根容器中创建普通用户不符合全局用户命名规则(默认需加C##前缀),因此会触发ORA-65096报错。
解决方案
方案1:登录时直接指定PDB(官方推荐,无需修改系统参数)
该方案不会修改数据库核心配置,无兼容性风险,适合绝大多数场景:
- 先编辑Oracle安装路径下的tnsnames.ora配置文件,路径为
%ORACLE_HOME%\network\admin\tnsnames.ora,添加orclpdb的连接配置:
ORCLPDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orclpdb) ) )
- 后续登录SQL Plus时直接指定连接
orclpdb即可,无需额外执行容器切换语句:- 普通用户登录:
sqlplus tester/tester@orclpdb - SYS管理员登录PDB:
sqlplus sys/你的SYS密码@orclpdb as sysdba
- 普通用户登录:
方案2:创建无C##前缀的全局公共用户(满足跨容器访问需求)
如果需要创建可以访问所有容器、无需C##前缀的全局用户,可按以下步骤操作:
- 以SYS AS SYSDBA身份登录根容器,执行参数修改语句:
alter system set "_common_user_prefix" = '' scope=spfile; - 重启数据库使配置生效:
shutdown immediate; startup;
- 创建全局用户并授权,指定
container=all让权限对所有容器生效:create user kaley identified by ThisIsMyPassword;grant dba to kaley container=all; - 该用户登录后如果需要访问
orclpdb内的表,可直接加PDB前缀查询:select * from orclpdb.表名,也可按方案1的方式登录时直接指定orclpdb服务名。
内容的提问来源于stack exchange,提问作者rtn60350
相关产品推荐
相关产品推荐

