Petit article, petite astuce.
Le Multitenant amène avec lui son lot de modifications dans nos habitudes par rapport à l’empirique architecture Monotenant.
L’une d’entre elles a dû en gêner plus d’un : l’impossibilité de se connecter en bequeath directement à une PDB.
En effet, « sqlplus / as sysdba » ouvre une session sur la « CDB$ROOT », il faut ensuite sélectionner la PDB cible via un « alter session set container=MyPDB; ».
Autre méthode : SQL*Net via un alias TNS : « sqlplus sys@MyPDBviaTNS as sysdba », mais passer par la case garniture des fichiers « tnsnames.ora ».
Sinon, il reste la chaine de connexion EasyConnect…
Depuis la version 18c, il est devenu possible de se connecter en bequeath directement un une PDB grâce à la nouvelle variable d’environnement « ORACLE_PDB_SID ».
Exemple sous bash :
$ . oraenv<<<MYCDB $ export ORACLE_PDB_SID=MYPDB $ sqlplus / as sysdba SQL> show con_name CON_NAME ------------------------------ MYPDB
Si l’on creuse un peu, ce dont on s’aperçoit c’est que :
- Cette possibilité n’arrive en fait qu’avec le RU APR19 des versions 18c et 19c
- C’est un trigger de base qui fait le job
Il est donc très aisé de corriger ce manque dans les versions 12.1 et 12.2 (si vous vous étiez déjà aventuré sur le tout nouveau terrain glissant du Multitenant) et bien évidement les versions 18c et 19c non patchées à minima en RU APR19, en créant par soi-même ce trigger :
create or replace trigger sys.set_pdb after logon on database declare l_pdb v$pdbs.name%type; begin dbms_system.get_env('ORACLE_PDB_SID', l_pdb); if (l_pdb is not null) then execute immediate 'alter session set container = '||'"'||l_pdb||'"'; end if; exception when others then null; end; /
Enjoy