CDB oder Non-CDB, das ist hier die Frage
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