Container applicazione
In un CDB è possibile creare un contenitore per i dati e i metadati dell'applicazione che possono essere condivisi dai PDB.
-
Informazioni sui container di applicazioni Un contenitore di applicazioni è un componente CDB facoltativo creato dall'utente che memorizza dati e metadati per uno o più backend delle applicazioni. Un CDB include zero o più container di applicazioni.
-
Oggetti comuni applicazione Un oggetto comune applicazione è un oggetto comune creato all'interno di un'applicazione in una radice applicazione. Gli oggetti comuni sono collegati ai dati o ai metadati.
-
Mappe dei container Una mappa dei container consente a una sessione connessa alla radice dell'applicazione di eseguire istruzioni SQL instradate al PDB appropriato, a seconda del valore di un predicato utilizzato nell'istruzione SQL.
-
Operazioni cross-container Un'operazione cross-container è un'istruzione DDL o DML che interessa più container contemporaneamente. Vedere anche: Oggetti comuni e locali per informazioni sugli oggetti comuni dell'applicazione
Informazioni sui container di applicazioni
Un contenitore dell'applicazione è un componente CDB facoltativo creato dall'utente che memorizza dati e metadati per uno o più backend dell'applicazione. Un CDB include zero o più container di applicazioni.
In un container di applicazioni, un'applicazione è il set con controllo delle versioni denominato di dati e metadati comuni memorizzati nella radice dell'applicazione. In questo contesto di un contenitore di applicazioni, il termine "applicazione" significa "definizione di applicazione principale". Ad esempio, l'applicazione potrebbe includere definizioni di tabelle, viste e pacchetti.
Ad esempio, è possibile creare più PDB correlati alle vendite all'interno di un contenitore dell'applicazione, con questi PDB che condividono un'applicazione costituita da un set di tabelle e definizioni di tabella comuni. È possibile memorizzare più PDB correlati alle HR all'interno di un contenitore di applicazioni separato, con tabelle e definizioni di tabella comuni.
L'istruzione CREATE PLUGGABLE DATABASE con la clausola AS APPLICATION CONTAINER crea la radice dell'applicazione del contenitore dell'applicazione e quindi crea implicitamente il contenitore dell'applicazione stesso. La prima volta che si crea il contenitore dell'applicazione, non contiene PDB. Per creare i PDB dell'applicazione, è necessario connettersi alla radice dell'applicazione, quindi eseguire l'istruzione CREATE PLUGGABLE DATABASE.
Nell'istruzione CREATE PLUGGABLE DATABASE, è necessario specificare un nome contenitore (che sia uguale al nome radice dell'applicazione), ad esempio saas_sales_ac. Il nome del contenitore dell'applicazione deve essere univoco all'interno del CDB e nell'ambito di tutti i CDB le cui istanze vengono raggiunte tramite un listener specifico. Ogni contenitore applicazioni dispone di un servizio predefinito con lo stesso nome del contenitore applicazioni.
-
Scopo dei contenitori di applicazioni In alcuni modi, un contenitore di applicazioni funge da CDB specifico dell'applicazione all'interno di un CDB. Un contenitore dell'applicazione, come il CDB stesso, può includere più PDB e consente a questi PDB di condividere metadati e dati.
-
Radice applicazione Un contenitore applicazioni dispone esattamente di una root applicazione, che è l'elemento padre dei PDB applicazione nel contenitore.
-
PDB applicazione Un PDB applicazione è un PDB che risiede in un contenitore applicazione. Ogni PDB in un CDB si trova in zero o in un contenitore di applicazioni.
-
Seed applicazione Un seed applicazione è un PDB facoltativo creato dall'utente all'interno di un contenitore applicazione. Un contenitore applicazione ha zero o un seed applicazione.
Scopo dei contenitori di applicazione
In alcuni modi, un contenitore dell'applicazione funge da CDB specifico dell'applicazione all'interno di un CDB. Un contenitore dell'applicazione, come il CDB stesso, può includere più PDB e consente a questi PDB di condividere metadati e dati.
La radice dell'applicazione consente ai PDB dell'applicazione di condividere un'applicazione, che in questo contesto indica un set denominato di metadati e dati comuni con controllo delle versioni. Un'applicazione tipica installa gli utenti comuni dell'applicazione, gli oggetti comuni collegati ai metadati e gli oggetti comuni collegati ai dati.
-
I vantaggi principali dei container di applicazioni offrono diversi vantaggi rispetto alla memorizzazione di ogni applicazione in un PDB separato.
-
Caso d'uso del contenitore delle applicazioni: SaaS una distribuzione SaaS può utilizzare più PDB dell'applicazione, ciascuno per un cliente separato, che condivide metadati e dati.
-
Caso d'uso Container di applicazioni: Logical Data Warehouse Un cliente può utilizzare più PDB dell'applicazione per risolvere i problemi di sovranità dei dati.
Vantaggi principali dei container di applicazioni
I container di applicazioni offrono diversi vantaggi rispetto alla memorizzazione di ogni applicazione in un PDB separato.
-
La radice dell'applicazione memorizza i metadati e i dati che tutti i PDB dell'applicazione possono condividere.
Ad esempio, tutti i PDB dell'applicazione possono condividere i dati in una tabella centrale, ad esempio una tabella con i ruoli applicazione predefiniti elencati. Inoltre, tutti i PDB possono condividere una definizione di tabella a cui aggiungono righe specifiche del PDB.
-
La definizione dell'applicazione principale viene mantenuta nella radice dell'applicazione, invece di mantenere una copia separata in ogni PDB.
Se si aggiorna l'applicazione nella radice dell'applicazione, le modifiche vengono propagate automaticamente a tutti i PDB dell'applicazione. Il backend dell'applicazione potrebbe contenere l'oggetto comune collegato ai dati
app_roles, ovvero una tabella che elenca i ruoli predefiniti:admin,manager,sales_repe così via. Un utente connesso a qualsiasi PDB applicazione può eseguire una query su questa tabella. -
Un contenitore dell'applicazione può includere un seed dell'applicazione, PDB dell'applicazione e PDB proxy (che fanno riferimento ai PDB in altri CDB).
-
È possibile creare rapidamente nuovi PDB applicazione dal seed applicazione.
-
È possibile eseguire query sulle viste che riportano su tutti i PDB nel contenitore dell'applicazione.
-
Durante la connessione alla radice dell'applicazione, è possibile utilizzare la funzione
CONTAINERSper eseguire DML sugli oggetti in più PDB.Ad esempio, se la tabella
productsesiste in ogni PDB dell'applicazione, è possibile connettersi alla radice dell'applicazione ed eseguire una query sui prodotti in tutti i PDB dell'applicazione utilizzando una singola istruzioneSELECT. -
È possibile scollegare un PDB da una radice applicazione, quindi collegarlo a una radice applicazione in una release di database Oracle successiva. Pertanto, i PDB sono utili in un upgrade del database Oracle.
Caso d'uso del contenitore di applicazione: SaaS
Una distribuzione SaaS può utilizzare più PDB applicativi, ciascuno per un cliente separato, che condivida i metadati e i dati.
In un ambiente SaaS puro, la definizione dell'applicazione principale risiede nella radice dell'applicazione, ma i dati specifici del cliente risiedono nel proprio PDB dell'applicazione. Ad esempio, sales_app è il modello di applicazione nella radice dell'applicazione. Il PDB dell'applicazione denominato cust1_pdb contiene i dati di vendita solo per il cliente 1, mentre il PDB dell'applicazione denominato cust2_pdb contiene i dati di vendita solo per il cliente 2. Il collegamento, lo scollegamento, la duplicazione e altre operazioni a livello di PDB sono disponibili per i singoli PDB dei clienti.
Figura 1: Caso d'uso SaaS

Descrizione dell'illustrazione cncpt389.png
Una configurazione SaaS pura offre i seguenti vantaggi:
-
Prestazioni
-
Sicurezza
-
Supporto per più clienti
I dati per ogni cliente risiedono nel proprio container, ma vengono consolidati in modo da poter gestire insieme molti clienti. Questo modello estende le economie di scala di gestione di molti come uno per l'amministratore delle applicazioni, non solo il DBA.
Caso d'uso container applicazione: Logical Data Warehouse
Un cliente può utilizzare più PDB dell'applicazione per risolvere i problemi di sovranità dei dati.
In un caso d'uso di esempio, un'azienda inserisce dati specifici per ogni trimestre finanziario in un PDB separato. Ad esempio, il contenitore applicazioni denominato sales_ac include q1_2016_pdb, q2_2016_pdb, q3_2016_pdb e q4_2016_pdb. Definire ogni transazione nel PDB corrispondente al trimestre associato. Per generare un report che aggrega le prestazioni in un anno, è possibile eseguire l'aggregazione tra i quattro PDB utilizzando la clausola CONTAINERS().
I vantaggi di questa progettazione logica del magazzino includono:
-
L'ETL per i dati specifici di un singolo PDB non influisce sugli altri PDB.
-
I piani di esecuzione sono più efficienti perché si basano sulla distribuzione effettiva dei dati.
Radice applicazioni
Un contenitore applicazioni dispone esattamente di una root applicazione, ovvero l'elemento padre dei PDB applicazione nel contenitore.
La proprietà di essere una radice applicazione viene stabilita al momento della creazione e non può essere modificata. L'unico contenitore a cui appartiene una radice applicazione è la radice CDB. Una radice dell'applicazione è simile alla radice CDB in alcuni modi e come un PDB in altri modi:
-
Come la radice CDB, una radice applicazione funge da contenitore padre per i PDB collegati. Quando si è connessi alla radice dell'applicazione, è possibile gestire utenti e privilegi comuni, creare PDB dell'applicazione, scambiare contenitori ed emettere DDL che si applica a tutti i PDB nel contenitore dell'applicazione.
-
Come un PDB, è possibile creare una radice applicazione con l'istruzione
CREATE PLUGGABLE DATABASE, modificarla conALTER PLUGGABLE DATABASEe modificarne la disponibilità conSTARTUPeSHUTDOWN. È possibile utilizzare DDL per collegare, scollegare e rimuovere le radici dell'applicazione. La radice dell'applicazione ha il proprio nome di servizio e gli utenti possono connettersi alla radice dell'applicazione nello stesso modo in cui si connettono a un PDB.
Una radice applicazione è diversa sia dalla radice CDB che dal PDB standard perché può memorizzare oggetti comuni creati dall'utente, denominati oggetti comuni dell'applicazione. Gli oggetti comuni dell'applicazione sono accessibili ai PDB dell'applicazione collegati alla radice dell'applicazione. Gli oggetti comuni dell'applicazione non sono visibili alla radice CDB, ad altre radici dell'applicazione o ai PDB che non appartengono alla radice dell'applicazione.
Esempio 3-1 Creazione di una radice applicazione
In questo esempio è possibile eseguire il login alla root del CDB come utente comune di amministrazione c##system. Creare un contenitore applicazione denominato saas_sales_ac, quindi aprire la radice applicazione, che ha lo stesso nome del contenitore.
-- Create the application container called saas_sales_ac
CREATE PLUGGABLE DATABASE saas_sales_ac AS APPLICATION CONTAINER
ADMIN USER saas_sales_ac_adm IDENTIFIED BY manager;
-- Open the application root
ALTER PLUGGABLE DATABASE saas_sales_ac OPEN;
Impostare il contenitore corrente su saas_sales_ac, quindi verificare che il contenitore sia la radice dell'applicazione.
-- Set the current container to saas_sales_ac
ALTER SESSION SET CONTAINER = saas_sales_ac;
COL NAME FORMAT a15
COL ROOT FORMAT a4
SELECT CON_ID, NAME, APPLICATION_ROOT AS ROOT,
APPLICATION_PDB AS PDB,
FROM V$CONTAINERS;
CON_ID NAME ROOT PDB
---------- --------------- ---- ---
3 SAAS_SALES_AC YES NO
Per il contenitore dell'applicazione, specificare i due parametri seguenti nello spazio di nomi USERENV della funzione SYS_CONTEXT.
SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT')
SYS_CONTEXT('USERENV', 'IS_APPLICATION_PDB')
Il valore di SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT') in una radice applicazione è il seguente:
SQL> select sys_context('USERENV', 'IS_APPLICATION_ROOT') from dual;
SYS_CONTEXT('USERENV','IS_APPLICATION_ROOT')
--------------------------------------------------------------------------------
YES
Si noti che il valore SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT') corrisponde alla colonna APPLICATION_ROOT nella vista V$PDBS.
SQL> select application_root from v$pdbs where con_id=sys_context('USERENV', 'CON_ID');
APP
---
YES
PDB applicazione
Un PDB applicazione è un PDB che risiede in un contenitore dell'applicazione. Ogni PDB in un CDB si trova in zero o in un contenitore di applicazioni.
Ad esempio, il contenitore dell'applicazione saas_sales_ac potrebbe supportare più clienti, con ogni applicazione cliente che memorizza i propri dati in un PDB separato. I PDB applicazione cust1_sales_pdb e cust2_sales_pdb potrebbero risiedere in saas_sales_ac, nel qual caso non appartengono ad altri container di applicazioni (anche se come PDB appartengono necessariamente anche alla radice CDB).
Creare un PDB dell'applicazione eseguendo CREATE PLUGGABLE DATABASE durante la connessione alla radice dell'applicazione. È possibile creare il PDB dell'applicazione da un seed oppure duplicare un PDB o collegarlo a un PDB scollegato. Come un PDB collegato alla radice CDB, è possibile duplicare, scollegare o eliminare un PDB dell'applicazione. Tuttavia, un PDB applicazione deve sempre appartenere a una radice applicazione.
Popolamento applicazione
Un seed dell'applicazione è un PDB facoltativo creato dall'utente all'interno di un contenitore dell'applicazione. Un contenitore applicazione ha zero o un seed applicazione.
Un seed dell'applicazione consente di creare rapidamente PDB dell'applicazione. Serve lo stesso ruolo all'interno del contenitore dell'applicazione utilizzato da PDB$SEED all'interno del CDB stesso.
Il nome iniziale dell'applicazione è sempre application_container_name$SEED, dove application_container_name è il nome del contenitore dell'applicazione. Ad esempio, utilizzare l'istruzione CREATE PDB ... AS SEED per creare saas_sales_ac$SEED nel contenitore dell'applicazione saas_sales_ac.
Oggetti comuni applicazione
Un oggetto comune applicazione è un oggetto comune creato all'interno di un'applicazione in una radice applicazione. Gli oggetti comuni sono collegati ai dati o ai metadati.
Per un oggetto comune collegato ai dati, i PDB dell'applicazione condividono un singolo set di dati. Ad esempio, un'applicazione per il contenitore dell'applicazione saas_sales_ac è denominata saas_sales_app, ha la versione 1.0 e include una tabella usa_zipcodes collegata ai dati. In questo caso, le righe vengono memorizzate una sola volta nella tabella nella radice dell'applicazione, ma sono visibili in tutti i PDB dell'applicazione.
Per un oggetto comune collegato ai metadati, i PDB dell'applicazione condividono solo i metadati, ma contengono set di dati diversi. Ad esempio, una tabella products collegata ai metadati ha la stessa definizione in ogni PDB dell'applicazione, ma le righe stesse sono specifiche del PDB. Il PDB dell'applicazione denominato cust1pdb potrebbe disporre di una tabella products contenente registri, mentre il PDB dell'applicazione denominato cust2pdb potrebbe disporre di una tabella products contenente ricambi automatici.
-
Informazioni sulla comunanza in un CDB Un fenomeno comune definito in un CDB o nella radice di un'applicazione è lo stesso in tutti i contenitori collegati a questa radice.
-
Creazione di oggetti comuni dell'applicazione Per creare oggetti comuni, connettersi a una radice dell'applicazione, quindi eseguire un'istruzione
CREATEche specifica un attributo di condivisione. -
Oggetti comuni dell'applicazione collegata ai metadati Un collegamento ai metadati è un oggetto dizionario che supporta il riferimento e la concessione di privilegi su metadati comuni condivisi da tutti i PDB nel contenitore dell'applicazione.
-
Oggetti comuni dell'applicazione collegata ai dati Un oggetto collegato ai dati è un oggetto i cui metadati e dati risiedono in una radice dell'applicazione e sono accessibili da tutti i PDB dell'applicazione in questo contenitore dell'applicazione.
-
Oggetti applicazione Data-Linked estesi Un oggetto Data-Linked esteso è un ibrido di un oggetto collegato ai dati e di un oggetto collegato ai metadati. Vedere anche: "Oggetti comuni e locali" per informazioni sugli oggetti comuni
La comunanza in un CDB
Un fenomeno comune definito in un CDB o in una radice applicazione è lo stesso in tutti i contenitori collegati a questa radice.
-
Principi di Commonality In un CDB, un fenomeno può essere comune all'interno del contenitore del sistema (il CDB stesso) o all'interno di un contenitore dell'applicazione specifico.
-
Spazi di nomi in un CDB In un CDB, lo spazio di nomi per ogni oggetto viene definito nel relativo contenitore.
Principi di Commonità
In un CDB, un fenomeno può essere comune all'interno del contenitore di sistema (il CDB stesso) o all'interno di un contenitore di applicazione specifico.
Ad esempio, se si crea un account utente comune mentre si è connessi a CDB$ROOT, questo account utente è comune a tutti i PDB e alle radici delle applicazioni nel CDB. Se si crea un account utente comune dell'applicazione mentre si è connessi a una radice dell'applicazione, tuttavia, questo account utente è comune solo ai PDB in questo contenitore dell'applicazione.
Nel contesto di CDB$ROOT o di una radice di applicazione, i principi di commonality sono i seguenti:
-
Un fenomeno comune è lo stesso in ogni contenitore esistente e futuro.
Pertanto, un utente comune definito nella radice CDB ha la stessa identità in ogni PDB collegato alla radice CDB; un utente comune definito in una radice applicazione ha la stessa identità in ogni PDB applicazione collegato a questa radice applicazione. Al contrario, un fenomeno locale viene applicato esattamente a un contenitore esistente.
-
Solo un utente comune può alterare l'esistenza di fenomeni comuni.
Più precisamente, solo un utente comune che ha eseguito il login alla radice CDB o a una radice applicazione può creare, eliminare o modificare attributi di un utente, ruolo o oggetto comuni al contenitore corrente.
Spazi di nomi in un CDB
In un CDB, lo spazio di nomi per ogni oggetto viene definito nel relativo contenitore.
I principi riportati di seguito riassumono le regole di ambito.
-
Dal punto di vista dell'applicazione, un PDB è un database separato distinto da qualsiasi altro PDB.
-
I fenomeni locali sono creati all'interno e limitati a un singolo contenitore.
Nota: in questo argomento, la parola "fenomeno" indica "account utente, ruolo o oggetto database".
-
I fenomeni comuni sono definiti in una radice CDB o in una radice applicazione ed esistono in tutti i PDB che sono o saranno collegati a questa radice.
I principi precedenti hanno implicazioni per i fenomeni locali e comuni.
Fenomeni locali
Un fenomeno locale deve essere denominato in modo univoco all'interno di un contenitore, ma non in tutti i contenitori del CDB. I fenomeni locali identici denominati in contenitori diversi sono distinti. Ad esempio, l'utente locale sh in un PDB non è in conflitto con l'utente locale sh in un altro PDB.
CDB$ROOT Fenomeni comuni
I fenomeni comuni definiti in CDB$ROOT esistono in più contenitori e devono essere univoci all'interno di ciascuno di questi spazi di nomi. Ad esempio, il file system root del CDB include utenti comuni predefiniti, quali SYSTEM e SYS. Per garantire la separazione degli spazi di nomi, Oracle AI Database impedisce la creazione di un utente SYSTEM all'interno di un altro contenitore.
Per garantire la separazione degli spazi di nomi, il nome dei fenomeni comuni creati dall'utente nella radice CDB deve iniziare con il valore specificato dal parametro di inizializzazione COMMON_USER_PREFIX. Il prefisso predefinito è c## o C##. I nomi di tutti gli altri fenomeni creati dall'utente non devono iniziare con c## o C##. Ad esempio, non è possibile creare un utente locale in hrpdb denominato c##hr né un utente comune nella radice del CDB denominata hr.
Fenomeni comuni applicazione
All'interno di un contenitore di applicazioni, i nomi dei fenomeni comuni locali e di applicazione non devono essere in conflitto.
-
Utenti e ruoli comuni dell'applicazione
Gli stessi principi si applicano agli utenti comuni dell'applicazione rispetto agli utenti comuni del CDB. La differenza è che per gli utenti comuni di CDB, il valore predefinito per il prefisso utente comune è
c##oC##, mentre nella radice dell'applicazione il valore predefinito per il prefisso utente comune è la stringa vuota.L'architettura multi-tenant presuppone che l'utente crei PDB dell'applicazione da una radice dell'applicazione o converta un'applicazione single-tenant in un'applicazione multi-tenant.
-
Oggetti comuni applicazione
L'architettura multi-tenant presuppone la creazione di oggetti comuni dell'applicazione nella radice dell'applicazione. Successivamente, si aggiungono i dati localmente all'interno dei PDB dell'applicazione. Tuttavia, Oracle AI Database supporta la creazione di tabelle locali all'interno di un PDB applicazione. In questo caso, le tabelle locali risiedono nello stesso spazio di nomi degli oggetti comuni dell'applicazione all'interno del PDB dell'applicazione.
Vedere anche: Oracle AI Database Security Guide per ulteriori informazioni su utenti e ruoli comuni
Creazione di oggetti comuni applicazione
Per creare oggetti comuni, connettersi a una radice applicazione, quindi eseguire un'istruzione CREATE che specifica un attributo di condivisione.
È possibile creare o modificare oggetti comuni dell'applicazione solo come parte dell'installazione, dell'aggiornamento o della patch di un'applicazione. È possibile specificare la condivisione nei modi seguenti:
-
Parametro di inizializzazione
DEFAULT_SHARINGL'impostazione è l'attributo di condivisione predefinito per tutti gli oggetti di database di un tipo supportato creato nella radice.
-
clausola
SHARINGQuesta clausola viene specificata nell'istruzione
CREATEstessa. Quando una clausolaSHARINGè inclusa in un'istruzione SQL, ha la precedenza sul valore specificato nel parametro di inizializzazioneDEFAULT_SHARING. I valori possibili sonoMETADATA,DATA,EXTENDED DATAeNONE.
La tabella seguente mostra i tipi di oggetti comuni dell'applicazione e la posizione in cui vengono memorizzati i dati e i metadati.
Tabella 1 Oggetti comuni applicazione
| Tipo di oggetto | Valore condivisione | Storage di metadati | Memorizzazione dati |
|---|---|---|---|
| Collegati ai dati | DATA |
Radice applicazione | Radice applicazione |
| Extended Data-Linked | EXTENDED DATA |
Radice applicazione | Radice applicazione e PDB applicazione |
| Metadati collegati | METADATA |
Radice applicazione | PDB applicazione |
Vedere anche: Oracle AI Database Security Guide per informazioni su come gestire i privilegi per gli oggetti comuni
Oggetti comuni dell'applicazione collegata ai metadati
Un collegamento ai metadati è un oggetto dizionario che supporta il riferimento e la concessione di privilegi su metadati comuni condivisi da tutti i PDB nel contenitore dell'applicazione.
Se si specifica il valore METADATA nella clausola SHARING o nel parametro di inizializzazione DEFAULT_SHARING, viene specificato un collegamento ai metadati di un oggetto, denominato oggetto comune collegato ai metadati. I metadati per l'oggetto vengono memorizzati una sola volta nella radice dell'applicazione.
Le tabelle, le viste e gli oggetti codice (ad esempio le procedure PL/SQL) possono condividere i metadati. In questo contesto, "metadati" include definizioni di colonna, vincoli, trigger e codice. Ad esempio, se sales_mlt è una tabella comune collegata ai metadati, tutti i PDB dell'applicazione accedono alla stessa definizione di questa tabella, memorizzata nella radice dell'applicazione, mediante un collegamento di metadati. Le righe in sales_mlt sono diverse in ogni PDB dell'applicazione, ma le definizioni delle colonne sono le stesse.
In genere, la maggior parte degli oggetti di un'applicazione viene collegata ai metadati. Pertanto, è necessario mantenere una sola definizione di applicazione principale. Questo approccio centralizza la gestione dell'applicazione in più PDB dell'applicazione.
Esempio 3-2 Creazione di un oggetto comune collegato ai metadati
In questo esempio l'utente SYSTEM esegue il login al contenitore dell'applicazione saas_sales_ac. SYSTEM installa un'applicazione denominata saas_sales_app alla versione 1.0. Questa applicazione crea un account utente comune denominato saas_sales_adm. Lo schema contiene una tabella comune collegata ai metadati denominata sales_mlt.
-- Begin the install of saas_sales_app
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app BEGIN INSTALL '1.0';
-- Create the tablespace for the app
CREATE TABLESPACE saas_sales_tbs DATAFILE SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 200M;
-- Create the user account saas_sales_adm, which will own the app
CREATE USER saas_sales_adm IDENTIFIED BY ****** CONTAINER=ALL;
-- Grant necessary privileges to this user account
GRANT CREATE SESSION, DBA TO saas_sales_adm;
-- Makes the tablespace that you just created the default for saas_sales_adm
ALTER USER saas_sales_adm DEFAULT TABLESPACE saas_sales_tbs;
-- Now connect as the application owner
CONNECT saas_sales_adm/******@saas_sales_ac
-- Create a metadata-linked table
CREATE TABLE saas_sales_adm.sales_mlt SHARING=METADATA
(YEAR NUMBER(4),
REGION VARCHAR2(10),
QUARTER VARCHAR2(4),
REVENUE NUMBER);
-- End the application installation
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app END INSTALL '1.0';
È possibile utilizzare l'istruzione ALTER PLUGGABLE DATABASE APPLICATION ... SYNC per sincronizzare i PDB dell'applicazione in modo da utilizzare la stessa definizione di applicazione principale. In questo modo, ogni PDB applicazione dispone di un collegamento di metadati alla tabella comune saas_sales_adm.sales_mlt. Il codice di livello intermedio che aggiorna sales_mlt nel PDB denominato cust1_pdb aggiunge righe a questa tabella in cust1_pdb, mentre il codice di livello intermedio che aggiorna sales_mlt in cust2_pdb aggiunge righe alla copia di questa tabella in cust2_pdb. Vengono condivisi solo i metadati della tabella, memorizzati nella radice dell'applicazione. Nota: Oracle AI Database Security Guide per ulteriori informazioni sul funzionamento dei privilegi oggetto concessi di frequente
- Collegamenti ai metadati Per gli oggetti comuni dell'applicazione collegati ai metadati, i metadati per l'oggetto vengono memorizzati una volta nella radice dell'applicazione. Un collegamento metadati è un oggetto dizionario il cui tipo di oggetto è uguale ai metadati che condivide.
Collegamenti metadati
Per gli oggetti comuni dell'applicazione collegati ai metadati, i metadati per l'oggetto vengono memorizzati una sola volta nella radice dell'applicazione. Un collegamento metadati è un oggetto dizionario il cui tipo di oggetto è uguale ai metadati che condivide.
La descrizione di un collegamento di metadati viene memorizzata nel dizionario dati del PDB in cui è stato creato. Un collegamento metadati deve essere di proprietà di un utente comune dell'applicazione. È possibile utilizzare collegamenti metadati solo per condividere i metadati di oggetti comuni di proprietà dell'autore nella radice CDB o in una radice applicazione.
A differenza di un collegamento dati, un collegamento metadati dipende solo da dati comuni. Ad esempio, se un'applicazione contiene le tabelle locali dow_close_lt e nasdaq_close_lt nella radice dell'applicazione, un utente comune non può creare collegamenti metadati a questi oggetti. Tuttavia, una tabella comune dell'applicazione denominata sales_mlt può essere collegata ai metadati.
Se un utente comune con privilegi modifica i metadati per sales_mlt, ad esempio aggiunge una colonna alla tabella, questa modifica viene propagata ai collegamenti metadati. Gli utenti del PDB dell'applicazione non possono modificare i metadati nel collegamento dei metadati. Ad esempio, un DBA che gestisce il PDB dell'applicazione denominato cust1_pdb non può aggiungere una colonna a sales_mlt solo in questo PDB: tali modifiche dei metadati possono essere apportate solo nella radice dell'applicazione.
Oggetti comuni dell'applicazione collegata ai dati
Un oggetto collegato ai dati è un oggetto i cui metadati e dati risiedono in una radice dell'applicazione e sono accessibili da tutti i PDB dell'applicazione in questo contenitore dell'applicazione.
Se si specifica il valore DATA nella clausola SHARING o nel parametro di inizializzazione DEFAULT_SHARING, viene specificato un collegamento a un oggetto comune, denominato oggetto comune collegato ai dati. Le tabelle dimensioni in un data warehouse sono spesso valide per le tabelle comuni collegate ai dati.
Un collegamento dati è un oggetto dizionario che funziona come un sinonimo. Ad esempio, se countries è una tabella comune dell'applicazione, tutti i PDB dell'applicazione accedono alla stessa copia di questa tabella mediante un collegamento dati. Se viene aggiunta una riga a questa tabella, questa riga è visibile in tutti i PDB dell'applicazione.
Un collegamento dati deve essere di proprietà di un utente comune applicazione. Il collegamento eredita il tipo di oggetto dall'oggetto a cui punta. La descrizione di un collegamento dati viene memorizzata nel dizionario del PDB in cui è stato creato. Ad esempio, se un contenitore dell'applicazione contiene 10 PDB dell'applicazione e ogni PDB contiene un collegamento alla tabella comune dell'applicazione countries, tutti i 10 PDB contengono definizioni di dizionario per questo collegamento.
Esempio 3-3 Creazione di un oggetto collegato ai dati
In questo esempio, SYSTEM si connette al contenitore dell'applicazione saas_sales_ac. SYSTEM aggiorna l'applicazione denominata saas_sales_app dalla versione 1.0 alla versione 2.0. Questo aggiornamento dell'applicazione esegue il login al contenitore come utente comune saas_sales_adm, crea una tabella collegata ai dati denominata countries_dlt e quindi inserisce righe in esso.
-- Begin an upgrade of the application
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app BEGIN UPGRADE '1.0' to '2.0';
-- Connect as application owner to application root
CONNECT saas_sales_adm/manager@saas_sales_ac
-- Create data-linked table named countries_dlt
CREATE TABLE countries_dlt SHARING=DATA
(country_id NUMBER,
country_name VARCHAR2(20));
-- Insert records into countries_dlt
INSERT INTO countries_dlt VALUES(1, 'USA');
INSERT INTO countries_dlt VALUES(44, 'UK');
INSERT INTO countries_dlt VALUES(86, 'China');
INSERT INTO countries_dlt VALUES(91, 'India');
-- End application upgrade
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app END UPGRADE TO '2.0';
Utilizzare l'istruzione ALTER PLUGGABLE DATABASE APPLICATION ... SYNC per sincronizzare i PDB applicazione con la radice dell'applicazione. In questo modo, ogni PDB dell'applicazione sincronizzata dispone di un collegamento dati alla tabella collegata ai dati saas_sales_adm.countries_dlt.
Oggetti applicazione collegati ai dati estesi
Un oggetto collegato ai dati estesi è un ibrido di un oggetto collegato ai dati e di un oggetto collegato ai metadati.
In un oggetto esteso collegato ai dati, i dati memorizzati nella radice dell'applicazione sono comuni a tutti i PDB dell'applicazione e tutti i PDB possono accedere a questi dati. Tuttavia, ogni PDB dell'applicazione può creare i propri dati specifici del PDB durante la condivisione dei dati comuni nella radice dell'applicazione. Pertanto, i PDB integrano i dati comuni con i propri dati.
Ad esempio, un'applicazione Sales potrebbe supportare diversi PDB applicazione. Tutti i PDB dell'applicazione richiedono i codici postali per gli Stati Uniti. In questo caso, è possibile creare una tabella zipcodes_edt estesa collegata ai dati nella radice dell'applicazione. La radice dell'applicazione memorizza i codici postali degli Stati Uniti, in modo che tutti i PDB dell'applicazione possano accedervi. Tuttavia, un PDB applicazione richiede i codici postali per gli Stati Uniti e il Canada. Questo PDB dell'applicazione può memorizzare i codici postali per il Canada nell'oggetto esteso collegato ai dati nel PDB dell'applicazione anziché nella radice dell'applicazione.
Creare un oggetto esteso collegato ai dati collegandosi alla radice dell'applicazione e specificando la parola chiave SHARING=EXTENDED DATA nell'istruzione CREATE.
Esempio 3-4 Creazione di un oggetto dati esteso
In questo esempio, SYSTEM si connette al contenitore dell'applicazione saas_sales_ac, quindi aggiorna l'applicazione denominata saas_sales_app (creata in "Esempio 3-2") dalla versione 2.0 alla versione 3.0. Questa applicazione esegue il login al contenitore come utente comune saas_sales_adm, crea una tabella estesa collegata ai dati denominata zipcodes_edt e vi inserisce le righe.
-- Begin an upgrade of the app
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app BEGIN UPGRADE '2.0' to '3.0';
-- Connect as app owner to app root
CONNECT saas_sales_adm/manager@saas_sales_ac
-- Create a common-data table named zipcodes_edt
CREATE TABLE zipcodes_edt SHARING=EXTENDED DATA
(code VARCHAR2(5),
country_id NUMBER,
region VARCHAR2(10));
-- Load rows into zipcodes_edt
INSERT INTO zipcodes_edt VALUES ('08820','1','East');
INSERT INTO zipcodes_edt VALUES ('10005','1','East');
INSERT INTO zipcodes_edt VALUES ('44332','1','North');
INSERT INTO zipcodes_edt VALUES ('94065','1','West');
INSERT INTO zipcodes_edt VALUES ('73301','1','South');
COMMIT;
-- End app upgrade
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app END UPGRADE TO '3.0';
Utilizzare l'istruzione ALTER PLUGGABLE DATABASE APPLICATION ... SYNC per sincronizzare i PDB applicazione con l'applicazione. In questo modo, ogni PDB dell'applicazione sincronizzata dispone di un collegamento dati alla tabella collegata ai dati saas_sales_adm.zipcodes_edt. Le applicazioni che si connettono a questi PDB possono visualizzare i codici postali inseriti in zipcodes_edt durante l'aggiornamento dell'applicazione, ma possono anche inserire i propri codici postali in questa tabella.
Mappe container
Una mappa dei contenitori consente a una sessione connessa alla radice dell'applicazione di eseguire istruzioni SQL instradate al PDB appropriato, a seconda del valore di un predicato utilizzato nell'istruzione SQL.
Una tabella di mapping specifica una colonna in una tabella comune collegata ai metadati e utilizza partizioni per associare PDB di applicazioni diversi a valori di colonna diversi. In questo modo, le mappe contenitore consentono il partizionamento dei dati a livello di PDB quando i dati non vengono partizionati fisicamente a livello di tabella.
Di seguito sono riportati i componenti chiave per l'utilizzo delle mappe contenitore.
-
Tabella collegata ai metadati
Questa tabella deve essere interrogata utilizzando la mappa contenitore. Ad esempio, è possibile creare una tabella collegata ai metadati denominata
countries_mltche memorizzi dati diversi in ogni PDB dell'applicazione. Inamer_pdb, la colonnacountries_mlt.cnamememorizza i nomi dei paesi nordamericani; ineuro_pdb, la colonnacountries_mlt.cnamememorizza i nomi dei paesi europei; inasia_pdb, la colonnacountries_mlt.cnamememorizza i nomi dei paesi asiatici. -
Tabella mappa
Nella radice dell'applicazione, è possibile creare una tabella mappa a colonna singola partizionata per elenco, hash o intervallo. La tabella di mapping consente di eseguire query sulla tabella collegata ai metadati utilizzando la strategia di partizionamento abilitata dalla mappa contenitore. I nomi delle partizioni nella tabella degli oggetti mappa devono corrispondere ai nomi dei PDB dell'applicazione nel contenitore dell'applicazione.
Ad esempio, la tabella mappa denominata
pdb_map_tblpuò essere partizionata in base all'elenco nella colonnacname. Le partizioni denominateamer_pdb,euro_pdbeasia_pdbcorrispondono ai nomi dei PDB applicazione. I valori in ciascuna partizione sono i nomi dei paesi, ad esempioPARTITION amer_pdb VALUES ('US','MEXICO','CANADA').A partire da Oracle Database 18c, affinché una query
CONTAINERS()utilizzi una mappa, la colonna di partizionamento nella tabella della mappa non deve corrispondere a una colonna nella tabella collegata ai metadati. Si supponga che la tabellash.salessia abilitata per la mappa contenitorepdb_map_tble checnamesia la colonna di partizionamento per la tabella mappa. Anche sesh.salesnon include una colonnacname, la tabella di mapping instrada la query seguente al PDB appropriato:SELECT * FROM CONTAINERS(sh.sales) WHERE cname = 'US' ORDER BY time_id. -
Mappa contenitore
Una mappa contenitore è una proprietà del database che specifica una tabella mappa. Per impostare la proprietà, connettersi alla radice dell'applicazione ed eseguire l'istruzione
ALTER PLUGGABLE DATABASE SET CONTAINER_MAP=map_table, dovemap_tableè il nome della tabella mappa.
Esempio 3-5 Creazione di una tabella collegata ai metadati, una tabella mappa e una mappa contenitore: parte 1
In questo esempio, è possibile eseguire il login come amministratore dell'applicazione alla radice dell'applicazione. Si supponga che un contenitore applicazioni disponga di tre PDB applicazione: amer_pdb, euro_pdb e asia_pdb. Ogni PDB dell'applicazione memorizza i nomi dei paesi per un'area diversa. Una tabella collegata ai metadati denominata oe.countries_mlt dispone di una colonna cname che memorizza il nome del paese. Per questa strategia di partizionamento, utilizzare partition by list per creare un oggetto mappa denominato salesadm.pdb_map_tbl che crei una partizione per ogni area. Il nome del paese determina l'area.
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app BEGIN INSTALL '1.0';
-- Create the metadata-linked table.
CREATE TABLE oe.countries_mlt SHARING=METADATA (
region VARCHAR2(30),
cname VARCHAR2(30));
-- Create the partitioned map table, which is list partitioned on the
-- cname column. The names of the partitions are the names of the
-- application PDBs.
CREATE TABLE salesadm.pdb_map_tbl (cname VARCHAR2(30) NOT NULL)
PARTITION BY LIST (cname) (
PARTITION amer_pdb VALUES ('US','MEXICO','CANADA'),
PARTITION euro_pdb VALUES ('UK','FRANCE','GERMANY'),
PARTITION asia_pdb VALUES ('INDIA','CHINA','JAPAN'));
-- Set the CONTAINER_MAP database property to the map object.
ALTER PLUGGABLE DATABASE SET CONTAINER_MAP='salesadm.pdb_map_tbl';
-- Enable the container map for the metadata-linked table to be queried.
ALTER TABLE oe.countries_mlt ENABLE CONTAINER_MAP;
-- Ensure that the table to be queried is enabled for the
-- CONTAINERS clause.
ALTER TABLE oe.countries_mlt ENABLE CONTAINERS_DEFAULT;
-- End the application installation.
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app END INSTALL '1.0';
Nota: sebbene si creino mappe contenitore utilizzando la sintassi di partizionamento, il database non utilizza la funzionalità di partizionamento. La definizione di una mappa contenitore non richiede Oracle Partitioning.
Nello script precedente, l'istruzione ALTER TABLE oe.countries_mlt ENABLE CONTAINERS_DEFAULT specifica che le query e le istruzioni DML emesse nella radice dell'applicazione devono utilizzare la clausola CONTAINERS() per impostazione predefinita per l'oggetto di database.
Esempio 3-6 Sincronizzazione dell'applicazione e aggiunta di dati: parte 2
Questo esempio continua con l'esempio precedente. Durante la connessione alla radice dell'applicazione, è possibile passare il contenitore corrente a ciascun PDB, sincronizzare l'applicazione saas_sales_app, quindi aggiungere dati specifici del PDB alla tabella oe.countries_mlt.
ALTER SESSION SET CONTAINER=amer_pdb;
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app SYNC;
INSERT INTO oe.countries_mlt VALUES ('AMER','US');
INSERT INTO oe.countries_mlt VALUES ('AMER','MEXICO');
INSERT INTO oe.countries_mlt VALUES ('AMER','CANADA');
COMMIT;
ALTER SESSION SET CONTAINER=euro_pdb;
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app SYNC;
INSERT INTO oe.countries_mlt VALUES ('EURO','UK');
INSERT INTO oe.countries_mlt VALUES ('EURO','FRANCE');
INSERT INTO oe.countries_mlt VALUES ('EURO','GERMANY');
COMMIT;
ALTER SESSION SET CONTAINER=asia_pdb;
ALTER PLUGGABLE DATABASE APPLICATION saas_sales_app SYNC;
INSERT INTO oe.countries_mlt VALUES ('ASIA','INDIA');
INSERT INTO oe.countries_mlt VALUES ('ASIA','CHINA');
INSERT INTO oe.countries_mlt VALUES ('ASIA','JAPAN');
COMMIT;
Esempio 3-7 Esecuzione di query sulla tabella collegata ai metadati: parte 3
Questo esempio continua con l'esempio precedente. È possibile connettersi alla radice dell'applicazione, quindi eseguire una query su oe.countries_mlt più volte, specificando paesi diversi nella clausola WHERE. La query restituisce il valore corretto dalla colonna oe.countries_mlt.region.
ALTER SESSION SET CONTAINER=saas_sales_ac;
SELECT region FROM oe.countries_mlt WHERE cname='MEXICO';
REGION
------
AMER
SELECT region FROM oe.countries_mlt WHERE cname='GERMANY';
REGION
------
EURO
SELECT region FROM oe.countries_mlt WHERE cname='JAPAN';
REGION
------
ASIA
Operazioni tra container
Un'operazione cross-container è un'istruzione DDL o DML che interessa più container contemporaneamente.
Solo un utente comune connesso alla root del CDB o a un'applicazione root può eseguire operazioni cross-container. Un'operazione cross-container può influire su quanto segue:
-
Il CDB stesso
-
Più contenitori all'interno di un CDB
-
Fenomeni multipli quali utenti comuni o ruoli comuni rappresentati in più contenitori
-
Un contenitore a cui l'utente che emette l'istruzione DDL o DML non è attualmente connesso
Esempi di operazioni DDL tra contenitori includono l'utente SYSTEM che concede un privilegio in genere a un altro utente comune e un'istruzione ALTER DATABASE . . . RECOVER che si applica all'intero CDB.
Quando si è connessi alla radice CDB o a una radice applicazione, è possibile eseguire una singola istruzione DML per modificare tabelle o viste in più PDB all'interno del contenitore. Il database ricava i PDB di destinazione dal valore della colonna CON_ID specificato nell'istruzione DML. Se non viene specificato alcun valore CON_ID, il database utilizza la proprietà CONTAINERS_DEFAULT_TARGET specificata dall'istruzione ALTER PLUGGABLE DATABASE CONTAINERS DEFAULT TARGET.
Esempio 3-8 Aggiornamento di più PDB in una singola istruzione DML
In questo esempio, l'obiettivo è impostare la colonna country_name sul valore USA nella tabella sh.sales. Questa tabella esiste in due PDB separati, con ID contenitore 7 e 8. Entrambi i PDB si trovano nel contenitore applicazioni denominato saas_sales_ac. È possibile connettersi alla radice dell'applicazione come amministratore ed eseguire l'aggiornamento come indicato di seguito.
CONNECT sales_admin@saas_sales_ac
Password: *******
UPDATE CONTAINERS(sh.sales) sal
SET sal.country_name = 'USA'
WHERE sal.CON_ID IN (7,8);
Nell'istruzione UPDATE precedente, sal è un alias per CONTAINERS(sh.sales).
Vedere anche: "Common User Accounts"