CDB oder Non-CDB, das ist hier die Frage

13. Februar 2014 Aus Von Markus Flechtner

Oracle sagt, dass es für eine Applikation “vollkommen transparent” ist, ob man sich in der klassischen Architektur (AKA “Non-CDB”) oder in einer Pluggable Database (PDB) in der neuen Container Datatabase-Architektur (CDB) bewegt.

Da stellt sich andersherum die Frage “wie kann ich feststellen, in welcher Datenbank-Architektur ich mich befinde?”

Die Lösung ist die Funktion “SYS_CONTEXT(‘USERENV’,’CDB_NAME’)”:

In einer Non-CDB-Datenbank

SQL> select sys_context('USERENV','CDB_NAME') from dual;
SYS_CONTEXT('USERENV','CDB_NAME')
-------------------------------------------------------------
NULL
 

In einer CDB-Datenbank (CDB$ROOT)

SQL> select sys_context('USERENV','CDB_NAME') from dual;
SYS_CONTEXT('USERENV','CDB_NAME')
----------------------------------------------------------
CDB1

und genauso in einer PDB:

SQL> select sys_context('USERENV','CDB_NAME') from dual;
SYS_CONTEXT('USERENV','CDB_NAME')
----------------------------------------------------------
CDB1

Das Ergebnis ist also entweder “NULL” oder der Name der zugehörigen Container-Datenbank.

Wenn man also als Software-Hersteller abhängig von der vom Kunden gewählten Architektur 12c-Features einsetzen möchte, die (noch) nicht in der CDB-Architektur verfügbar sind (z.B. Heatmap (ILM) oder Temporal Validity), dann kann man seine Installationsskripte über diese Abfrage entsprechend steuern.

Update:
Wenn der User Zugriff auf V$DATABASE hat, kann man darüber natürlich auch diese Infos erfahren:

SQL> connect system/manager@crm01
Connected.
SQL> select name,cdb from v$database;

NAME	  CDB
--------- ---
CDB1	  YES