学习翻译自Oracle官方文档
版本
Oracle 数据库 - 企业版 19.3.0.0.0 及更高版本。
目的
19c容器数据库环境下通过OS认证连接PDB的方法。
方法
由于 PDB 中没有可用的遗赠连接,因此无法通过 OS 身份验证直接连接到 PDB。可以通过登录触发器 SYS 或其他外部用户可以在没有密码的情况下连接到 PDB。
1. 设置ORACLE_PDB_SID 。SYS用户可以通过预定义的触发器DBMS_SET_PDB和环境变量ORACLE_PDB_SID连接到PDB。设置ORACLE_PDB_SID
$export ORACLE_PDB_SID=PDB1
$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Nov 17 13:25:04 2020
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show con_name
CON_NAME
------------------------------
PDB1
SQL> quit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
$ unset ORACLE_PDB_SID
$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Nov 17 13:27:49 2020
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> quit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
2.对于非SYS用户,通过触发器定义SET_PDB和环境变量ORACLE_PDB连接到PDB。
sqlplus / as sysdba
--修改初始化 parameter os_authent_prefix 与 common_user_prefix参数为相同值
show parameter os_authent_prefix
alter system set os_authent_prefix='C##' scope=spfile;
--创建普通用户并授予必要的权限,例如创建会话、设置容器等。
create user c##<OS_USER_NAME> identified externally container=all;
grant create session,set container,<Other Privilege> to c##<OS_USER_NAME>;
----重新启动数据库
shutdown immediate
startup
--为这个普通用户创建登录触发器。
sqlplus / as sysdba
CREATE OR REPLACE TRIGGER SYS.set_pdb
AFTER LOGON ON DATABASE
WHEN (USER like '&USERNAME')
DECLARE
pdb_name varchar(64);
BEGIN
sys.DBMS_SYSTEM.get_env('ORACLE_PDB',pdb_name);
if(pdb_name is not null) then
EXECUTE IMMEDIATE 'alter session set container='||'"'||pdb_name||'"';
end if;
EXCEPTION when others then
null;
END set_pdb;
/
--sqlnet.ora 设置:
SQLNET.AUTHENTICATION_SERVICES = (ALL)
--Connect test
export ORACLE_PDB=<Target PDB name>
sqlplus /
show con_name
show user




