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 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 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.

Vantaggi principali dei container di applicazioni

I container di applicazioni offrono diversi vantaggi rispetto alla memorizzazione di ogni applicazione in un PDB separato.

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:

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:

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:

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.

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 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:

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.

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.

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:

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 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.

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:

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"