Connexion PDB locale

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