Dizionario dati e viste prestazioni dinamiche

Il set centrale di tabelle e viste di riferimento di sola lettura di ciascun database Oracle è noto collettivamente come dizionario dati. Le viste delle prestazioni dinamiche sono viste speciali che vengono aggiornate continuamente mentre un database è aperto e in uso.

Panoramica del dizionario dati

Una parte importante di un database Oracle è il dizionario dati, che è un set di tabelle di sola lettura che fornisce metadati amministrativi sul database.

Scopo del dizionario dati

Il dizionario dati contiene metadati che descrivono il contenuto del database.

Ad esempio, il dizionario dati contiene informazioni quali:

Gestione dati

Il dizionario dati è una parte centrale della gestione dei dati per ogni database Oracle.

Ad esempio, il database esegue le azioni riportate di seguito.

Poiché Oracle AI Database memorizza i dati del dizionario dati in tabelle, proprio come altri dati, gli utenti possono eseguire una query sui dati con SQL. Ad esempio, gli utenti possono eseguire istruzioni SELECT per determinare i loro privilegi, quali tabelle esistono nel loro schema, quali colonne sono in queste tabelle, se gli indici sono costruiti su queste colonne e così via.

Vedere anche:

Separazione del dizionario dati in un CDB

In un CDB, i metadati del dizionario dati vengono suddivisi tra la radice del CDB e i PDB. Dal punto di vista dell'utente e dell'applicazione, il dizionario dati in ciascun contenitore in un CDB è separato.

In un CDB appena creato che non contiene ancora dati utente, il dizionario dati nella radice CDB contiene solo metadati di sistema. Ad esempio, la tabella TAB$ contiene righe che descrivono solo le tabelle fornite da Oracle, ad esempio TRIGGER$ e SERVICE$. Il grafico seguente mostra tre tabelle del dizionario dati sottostanti, con le barre rosse che indicano le righe che descrivono il sistema.

Figura 1: Metadati del dizionario dati nella radice CDB

Descrizione dell'immagine cncpt_vm_363.png

Si supponga di creare un PDB, quindi di creare uno schema hr contenente le tabelle employees e departments in questo PDB. Il dizionario dati nel PDB contiene alcune righe che descrivono le entità fornite da Oracle e altre righe che descrivono le entità create dall'utente. Ad esempio, la tabella TAB$ nel dizionario PDB contiene una riga di metadati per la tabella employees e una riga per la tabella departments.

Figura 2: Architettura del dizionario dati in un CDB

Descrizione dell'illustrazione cncpt_vm_361.png

L'immagine precedente mostra che il dizionario dati nel PDB contiene puntatori per il dizionario dati nella radice CDB. Gli oggetti forniti da Oracle, ad esempio le definizioni delle tabelle del dizionario dati e i package PL/SQL, vengono rappresentati solo una volta nella radice del CDB. Questa architettura raggiunge due obiettivi principali all'interno del CDB:

Componenti dizionario dati

Il dizionario dati è costituito da tabelle e viste di base.

Gli oggetti vengono definiti come segue:

In genere, le viste del dizionario dati sono raggruppate in set. In molti casi, un set è costituito da tre viste contenenti informazioni simili e distinte l'una dall'altra per i prefissi, come mostrato nella tabella seguente. Interrogando le viste appropriate, è possibile accedere solo alle informazioni rilevanti per l'utente.

Tabella 1 - Serie di viste dizionario dati

Prefisso Accesso utente Contenuti Note
DBA_ Amministratori del database Tutti gli elementi Alcune viste DBA_ dispongono di colonne aggiuntive contenenti informazioni utili per l'amministratore.
ALL_ Tutti gli utenti Oggetti per i quali l'utente dispone dei privilegi Include gli oggetti di proprietà dell'utente. Queste viste obbediscono al set corrente di ruoli abilitati.
USER_ Tutti gli utenti Oggetti di proprietà dell'utente Le viste con il prefisso USER_ in genere escludono la colonna OWNER. Questa colonna è implicita nelle viste USER_ come utente che invia la query.

Non tutti i set di viste hanno tre membri. Ad esempio, il dizionario dati contiene una vista DBA_LOCK, ma non una vista ALL_LOCK.

La vista DICTIONARY fornita dal sistema contiene i nomi e le descrizioni abbreviate di tutte le viste del dizionario dati. La seguente query di questa vista include output di esempio parziale:

SQL> SELECT * FROM DICTIONARY
  2  ORDER BY TABLE_NAME;

TABLE_NAME                     COMMENTS
------------------------------ ----------------------------------------
ALL_ALL_TABLES                 Description of all object and relational
                               tables accessible to the user

ALL_APPLY                      Details about each apply process that
                               dequeues from the queue visible to the
                               current user
.
.
.

Vedere anche:

Oggetti dati contenitore in un CDB

Un oggetto dati del contenitore è una tabella o una vista contenente dati relativi a più contenitori o all'intero CDB.

I privilegi dei dati del contenitore supportano un requisito generale in cui più PDB risiedono in un singolo CDB, ma con requisiti di amministrazione locali diversi. Ad esempio, se i DBA delle applicazioni non desiderano amministrare localmente, possono concedere privilegi sui dati dei container su viste appropriate agli utenti comuni. In questo caso, l'amministratore del CDB può accedere ai dati per questi PDB. Al contrario, gli amministratori del PDB che non desiderano che l'amministratore del CDB acceda ai propri dati non concedono i privilegi dei dati del contenitore.

Esempi di oggetti dati contenitore sono viste fornite da Oracle i cui nomi iniziano con V$ e CDB_. Tutti gli oggetti dati contenitore hanno una colonna CON_ID. La tabella seguente mostra il significato dei valori per questa colonna.

Valori ID container tabella 2

ID contenitore Le righe si riferiscono a
0 CDB intero
1 CDB$ROOT
2 PDB$SEED
Tutti gli altri ID PDB creati dall'utente, radici delle applicazioni o seed dell'applicazione

In un CDB, per ogni vista DBA_, esiste una vista CDB_ corrispondente. Il proprietario di una vista CDB_ è il proprietario della vista DBA_ corrispondente. Il grafico seguente mostra la relazione tra le diverse categorie di viste dizionario:

Figura 3: Viste del dizionario in un CDB

Descrizione dell'immagine cncpt_vm_366.png

Quando il contenitore corrente è un PDB, un utente può visualizzare le informazioni del dizionario dati solo per il PDB corrente. Quando il contenitore corrente è la radice CDB, tuttavia, un utente comune può eseguire una query sulle viste CDB_ per visualizzare i metadati per la radice CDB e per i PDB per i quali questo utente dispone di privilegi. Nota: quando viene eseguita una query dalla radice CDB, le viste CDB_ e V$ convertono in modo implicito i dati nel set di caratteri AL32UTF8. Se un set di caratteri richiede più byte per rappresentare un carattere quando viene convertito in AL32UTF8 e se la larghezza della colonna della vista non può contenere i dati di un PDB specifico, è possibile troncare i dati.

Nella tabella seguente vengono descritte le query delle viste CDB_. Ogni riga descrive un'azione che si verifica dopo l'azione nella riga precedente.

Tabella 3 Esecuzione di query sulle viste CDB_

Operazione Descrizione
SQL> CONNECT SYSTEM
 Enter password: ********
 Connected.

L'utente SYSTEM, comune a tutti i container nel CDB, si connette alla root del CDB (vedere "Common User Accounts").

SQL> SELECT COUNT(*) FROM CDB_USERS
  WHERE CON_ID=1;

  COUNT(*)
 --------
 38
SYSTEM esegue una query su CDB_USERS per ottenere il numero di utenti comuni nella root del CDB. L'output indica che 38 utenti comuni sono presenti nella directory root dei CDB.
SQL> SELECT COUNT(DISTINCT(CON_ID))
  FROM CDB_USERS;

  COUNT(DISTINCT(CON_ID))
 -----------------------
 4
SYSTEM esegue una query su CDB_USERS per determinare il numero di contenitori distinti nel CDB.
SQL> CONNECT SYSTEM@hrdb
 Enter password: ********
 Connected.
L'utente SYSTEM ora si connette al PDB denominato hrpdb.
SQL> SELECT COUNT(*) FROM CDB_USERS;

  COUNT(*)
 ----------
 48
SYSTEM interroga CDB_USERS. L'output indica che nel contenitore corrente esistono 48 utenti comuni e locali, ovvero hrpdb.
SQL> SELECT COUNT(*) FROM DBA_USERS;

  COUNT(*)
 ----------
 48
SYSTEM interroga DBA_USERS. L'output è uguale alla query precedente. Poiché SYSTEM non è connesso al root del CDB, la vista DBA_USERS mostra lo stesso output di CDB_USERS. Poiché DBA_USERS mostra solo gli utenti nel contenitore corrente, ne mostra 48.

Viste con il prefisso DBA_

Le viste con il prefisso DBA_ mostrano tutte le informazioni rilevanti nell'intero database. Le viste DBA_ sono riservate agli amministratori.

La seguente query di esempio mostra informazioni su tutti gli oggetti nel database:

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM   DBA_OBJECTS
ORDER BY OWNER, OBJECT_NAME;

Vedere anche: Oracle AI Database Administrator's Guide per informazioni dettagliate sui privilegi amministrativi

Viste con il prefisso ALL_

Le viste con il prefisso ALL_ fanno riferimento alla prospettiva complessiva dell'utente del database.

Queste viste restituiscono informazioni sugli oggetti dello schema a cui l'utente ha accesso tramite privilegi pubblici o espliciti di privilegi e ruoli, oltre agli oggetti dello schema di proprietà dell'utente.

Ad esempio, la seguente query restituisce informazioni su tutti gli oggetti a cui si ha accesso:

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM   ALL_OBJECTS
ORDER BY OWNER, OBJECT_NAME;

Poiché le viste ALL_ obbediscono al set corrente di ruoli abilitati, i risultati delle query dipendono dai ruoli abilitati, come mostrato nell'esempio riportato di seguito.

SQL> SET ROLE ALL;

Role set.

SQL> SELECT COUNT(*) FROM ALL_OBJECTS;

COUNT(*)
----------
68295

SQL> SET ROLE NONE;

Role set.

SQL> SELECT COUNT(*) FROM ALL_OBJECTS;

COUNT(*)
----------
53771

Gli sviluppatori di applicazioni devono essere consapevoli dell'effetto dei ruoli quando utilizzano le viste ALL_ in una procedura memorizzata, in cui i ruoli non sono abilitati per impostazione predefinita.

Viste con il prefisso USER_

Le viste che più probabilmente interessano gli utenti di database standard sono quelle con il prefisso USER_.

Queste viste:

Ad esempio, la query seguente restituisce tutti gli oggetti contenuti nello schema:

SELECT OBJECT_NAME, OBJECT_TYPE
FROM   USER_OBJECTS
ORDER BY OBJECT_NAME;

Il tavolo DUAL

DUAL è una piccola tabella nel dizionario dati a cui Oracle AI Database e i programmi scritti dall'utente possono fare riferimento per garantire un risultato noto.

La tabella doppia è utile quando un valore deve essere restituito una sola volta, ad esempio la data e l'ora correnti. Tutti gli utenti del database hanno accesso a DUAL.

La tabella DUAL contiene una colonna denominata DUMMY e una riga contenente il valore X. Nell'esempio seguente viene eseguita una query su DUAL per eseguire un'operazione aritmetica.

SQL> SELECT ((3*4)+5)/3 FROM DUAL;

((3*4)+5)/3
-----------
 5.66666667

Per ulteriori informazioni sulla tabella DUAL, vedere anche: Oracle AI Database SQL Language Reference

Funzionamento del dizionario dati

L'account utente SYS di Oracle AI Database è proprietario di tutte le tabelle di base e di tutte le viste accessibili dall'utente del dizionario dati.

Durante il funzionamento del database, Oracle AI Database legge il dizionario dati per verificare che gli oggetti dello schema esistano e che gli utenti dispongano dell'accesso appropriato. Oracle AI Database aggiorna continuamente il dizionario dati per riflettere i cambiamenti nelle strutture del database, nell'auditing, nelle concessioni e nei dati.

Ad esempio, se l'utente hr crea una tabella denominata interns, il database aggiunge nuove righe al dizionario dati che riflettono la nuova tabella, le nuove colonne, il segmento, le estensioni e i privilegi di cui dispone hr nella tabella. Queste nuove informazioni sono visibili alla successiva interrogazione delle viste del dizionario.

I dati nelle tabelle di base del dizionario dati sono necessari per il funzionamento di Oracle AI Database. Solo Oracle AI Database deve scrivere o modificare le informazioni del dizionario dati. Nessun utente di Oracle AI Database dovrebbe mai modificare righe o oggetti dello schema contenuti nello schema SYS, perché tale attività può compromettere l'integrità dei dati. L'amministratore della sicurezza deve tenere rigorosamente sotto controllo questo account fondamentale.

Avvertenza: la modifica o la manipolazione dei dati nelle tabelle del dizionario dati può influire in modo permanente e negativo sull'operazione del database.

Metadati e collegamenti dati

Il CDB utilizza un meccanismo di collegamento interno per separare le informazioni del dizionario dati.

In particolare, Oracle AI Database utilizza i seguenti puntatori gestiti automaticamente:

Oracle AI Database crea e gestisce automaticamente i collegamenti di metadati e dati a CDB$ROOT. Gli utenti non possono aggiungere, modificare o rimuovere questi collegamenti.

Vedere anche:

Sinonimi pubblici per le viste del dizionario dati

Oracle AI Database crea sinonimi pubblici per molte viste del dizionario dati in modo che gli utenti possano accedervi comodamente.

L'amministratore della sicurezza può anche creare sinonimi pubblici aggiuntivi per gli oggetti dello schema utilizzati a livello di sistema. Oracle sconsiglia di utilizzare lo stesso nome per un oggetto schema privato e un sinonimo pubblico.

Vedere anche: "Panoramica dei sinonimi"

Cache dizionario dati

La maggior parte delle informazioni del dizionario dati si trova nella cache del dizionario dati perché il database richiede costantemente le informazioni per convalidare l'accesso degli utenti e verificare lo stato degli oggetti dello schema.

Le cache in genere contengono le informazioni di analisi. Le colonne COMMENTS che descrivono le tabelle e le relative colonne non vengono inserite nella cache del dizionario, ma possono essere inserite nella cache nella cache del buffer del database.

Vedere anche: "Data Dictionary Cache"

Altri programmi e dizionario dati

Altri prodotti Oracle AI Database possono fare riferimento a viste esistenti e creare tabelle o viste del dizionario dati aggiuntive proprie.

Oracle consiglia agli sviluppatori di applicazioni che scrivono programmi riferiti al dizionario dati di utilizzare i sinonimi pubblici anziché le tabelle sottostanti. I sinonimi hanno meno probabilità di cambiare tra le versioni.

Archiviazione dizionario dati

Il dizionario dati che memorizza i metadati per il CDB nel suo complesso viene memorizzato solo nelle tablespace del sistema.

Il dizionario dati che memorizza i metadati per un PDB specifico viene memorizzato nelle tablespace autonome dedicate a questo PDB. Le tablespace PDB contengono sia i dati che i metadati per il backend di un'applicazione. Pertanto, ogni set di tabelle del dizionario dati viene memorizzato nel proprio set dedicato di tablespace.

Vedere anche: "The SYSTEM Tablespace" per ulteriori informazioni sulla tablespace SYSTEM

Panoramica delle viste prestazioni dinamiche

Durante il suo funzionamento, Oracle AI Database gestisce un set di tabelle virtuali che registrano l'attività corrente del database.

Queste viste sono dinamiche perché vengono continuamente aggiornate mentre un database è aperto e in uso. Le viste sono talvolta denominate Viste V$ perché i loro nomi iniziano con V$.

Le viste delle prestazioni dinamiche contengono informazioni quali:

Le viste prestazioni dinamiche utilizzano i seguenti usi principali:

Contenuto delle viste prestazioni dinamiche

Le viste prestazioni dinamiche sono denominate viste fisse perché non possono essere modificate o rimosse da un amministratore di database. Tuttavia, gli amministratori del database possono eseguire query e creare viste sulle tabelle e concedere l'accesso a tali viste ad altri utenti.

SYS possiede le tabelle delle prestazioni dinamiche, i cui nomi iniziano con V_$. Le viste vengono create su queste tabelle, quindi i sinonimi pubblici preceduti dal prefisso V$. Ad esempio, la vista V$DATAFILE contiene informazioni sui file di dati. La vista V$FIXED_TABLE contiene informazioni su tutte le tabelle e viste delle prestazioni dinamiche.

Per quasi tutte le viste V$, esiste una vista GV$ corrispondente. In Oracle Real Application Clusters (Oracle RAC), l'esecuzione di una query su una vista GV$ recupera le informazioni sulla vista V$ da tutte le istanze di database qualificate.

Quando si utilizza Database Configuration Assistant (DBCA) per creare un database, Oracle crea automaticamente il dizionario dati. Oracle AI Database esegue automaticamente lo script catalog.sql, che contiene le definizioni delle viste e i sinonimi pubblici per le viste delle prestazioni dinamiche. È necessario eseguire catalog.sql per creare queste viste e questi sinonimi.

Vedere anche:

Memorizzazione delle viste prestazioni dinamiche

Le viste delle prestazioni dinamiche si basano su tabelle virtuali create dalle strutture di memoria del database.

Le viste non sono tabelle convenzionali memorizzate nel database. La coerenza della lettura non è garantita per le viste perché i dati vengono aggiornati in modo dinamico.

Poiché le viste delle prestazioni dinamiche non sono tabelle true, i dati dipendono dallo stato del database e dall'istanza del database. Ad esempio, è possibile eseguire una query su V$INSTANCE e V$BGPROCESS quando il database viene avviato ma non attivato. Tuttavia, non è possibile eseguire una query su V$DATAFILE finché il database non è stato attivato.

Vedere anche: "Concorrenza e coerenza dei dati"

Metadati oggetto database

Il pacchetto DBMS_METADATA e la funzione DBMS_DEVELOPER.GET_METADATA forniscono interfacce per l'estrazione di definizioni complete di oggetti di database.

Utilizzando il pacchetto DBMS_METADATA, le definizioni possono essere espresse come XML o come SQL DDL. Oracle AI Database offre due stili di interfaccia: un'interfaccia flessibile e sofisticata per il controllo programmatico e un'interfaccia semplificata per l'esecuzione di query ad hoc.

Utilizzando la funzione DBMS_DEVELOPER.GET_METADATA, i metadati dell'oggetto vengono restituiti come documento JSON.

Per ulteriori informazioni su DBMS_METADATA, vedere anche: Oracle AI Database PL/SQL Packages and Types Reference. Oracle AI Database PL/SQL Packages and Types Reference per ulteriori informazioni su DBMS_DEVELOPER.GET_METADATA.