DOAG Datenbank Kolumne: Die versteckten Spalten in den CDB-Views

  • Erstellt von Markus Flechtner
  • Datenbank Kolumne, Oracle, Datenbank

Seitdem Oracle mit der Version 12c die Multitenant-Architektur eingeführt hat, gibt es eine neue Ebene im Data-Dictionary: die CDB-Views.

Dort hat man den Überblick über alle Container; die jeweiligen Zeilen werden über die Spalte CON_ID den einzelnen Containern zugeordnet. Aber wie kann man sich einfach den Namen des zugehörigen Containers anzeigen lassen?

Das Naheliegendste ist ein Join mit der View CDB_PDBS, der View V$PDBS oder der View V$CONTAINERS über die Spalte CON_ID:

 

SQL> select f.con_id,c.name,f.file_name

  2  from cdb_data_files f,v$containers c

  3  where c.con_id=f.con_id;

 

CON_ID NAME       FILE_NAME

---------- ---------- --------------------------------------------------

       1 CDB$ROOT   /opt/oracle/oradata/FREE/users01.dbf

       1 CDB$ROOT   /opt/oracle/oradata/FREE/undotbs01.dbf

       1 CDB$ROOT   /opt/oracle/oradata/FREE/system01.dbf

       1 CDB$ROOT   /opt/oracle/oradata/FREE/sysaux01.dbf

[…]

 

Es geht aber auch einfacher, ganz ohne Join:

SQL> select f.con_id,con$name,file_name from cdb_data_files f

 

    CON_ID CON$NAME   FILE_NAME

---------- ---------- --------------------------------------------------

       1 CDB$ROOT   /opt/oracle/oradata/FREE/users01.dbf

       1 CDB$ROOT   /opt/oracle/oradata/FREE/undotbs01.dbf

       1 CDB$ROOT   /opt/oracle/oradata/FREE/system01.dbf

       1 CDB$ROOT   /opt/oracle/oradata/FREE/sysaux01.dbf

[…]

 

Wo kommt diese Spalte CON$NAME her?

Der Grund liegt im Aufbau der CDB-Views. Bei den CDB-Views wendet Oracle die CONTAINERS-Klausel. Damit kann man container-übergreifende Abfragen formulieren. Dabei müssen die zugrunde liegenden Views oder Tabellen in den abgefragten Containern jeweils die gleiche Struktur haben (bzw. die abgefragten Spalten müssen in allen Containern vorhanden sein).

Für die View CDB_DATA_FILES sieht die Abfrage wie folgt aus:

SQL> select text from dba_views where view_name='CDB_DATA_FILES';

 

TEXT

---------------------------------------------------------------------------

SELECT k."FILE_NAME",k."FILE_ID",k."TABLESPACE_NAME",k."BYTES",k."BLOCKS",k."STA

TUS",k."RELATIVE_FNO",k."AUTOEXTENSIBLE",k."MAXBYTES",k."MAXBLOCKS",k."INCREMENT

_BY",k."USER_BYTES",k."USER_BLOCKS",k."ONLINE_STATUS",k."LOST_WRITE_PROTECT",k."

CON_ID", k.CON$NAME, k.CDB$NAME, k.CON$ERRNUM, k.CON$ERRMSG FROM CONTAINERS("SYS

"."DBA_DATA_FILES")  k

 

In dem obigen Beispiel sieht man, dass es neben CON$NAME auch noch weitere versteckte Spalten in den CDB-Views gibt:

  • CON$NAME – Name des zugehörigen Containers
  • CDB$NAME – Name der Container-Datenbank

Die versteckten Spalten CON$ERRNUM und CON$ERRMSG sind nicht dokumentiert und üblicherweise gleich Null bzw. leer.

Mit etwas Kenntnis der Abfrage-Strukturen im Data Dictionary kann man sich also Tipparbeit sparen – aber es bleibt die Frage, warum Oracle diese beiden Spalten in den CDB-Views vor dem Benutzer versteckt.

 

Markus Flechtner

DOAG Themenverantwortlicher Open Source

 

----

Bild von StockSnap auf Pixabay

 

 

 

Datenbank-Kolumne-Die-versteckten-Spalten-in-den-CDB-Views_WEB_1000x750px.jpg
© StockSnap