Contenedores de aplicaciones

En una CDB, puede crear un contenedor de datos y metadatos de aplicaciones que puedan compartir las PDB.

Acerca de los contenedores de aplicaciones

Un contenedor de aplicación es un componente de CDB opcional creado por el usuario que almacena datos y metadatos para uno o más backends de aplicaciones. Una CDB incluye cero o más contenedores de aplicaciones.

Dentro de un contenedor de aplicación, una aplicación es el conjunto con nombre y versiones de datos y metadatos comunes almacenados en la raíz de la aplicación. En este contexto de un contenedor de aplicación, el término "aplicación" significa "definición de aplicación maestra". Por ejemplo, la aplicación puede incluir definiciones de tablas, vistas y paquetes.

Por ejemplo, puede crear varias PDB relacionadas con ventas en un contenedor de aplicaciones, con estas PDB compartiendo una aplicación que consta de un juego de tablas y definiciones de tablas comunes. Puede almacenar varias PDB relacionadas con RR HH en un contenedor de aplicaciones independiente, con sus propias tablas y definiciones de tablas comunes.

La sentencia CREATE PLUGGABLE DATABASE con la cláusula AS APPLICATION CONTAINER crea la raíz de aplicación del contenedor de aplicación y, por lo tanto, crea implícitamente el contenedor de aplicación en sí. La primera vez que crea el contenedor de aplicación, no contiene ninguna PDB. Para crear PDB de aplicación, debe conectarse a la raíz de aplicación y, a continuación, ejecutar la sentencia CREATE PLUGGABLE DATABASE.

En la sentencia CREATE PLUGGABLE DATABASE, debe especificar un nombre de contenedor (que sea el mismo que el nombre raíz de la aplicación), por ejemplo, saas_sales_ac. El nombre del contenedor de aplicación debe ser único dentro de la CDB y dentro del ámbito de todas las CDB cuyas instancias se alcanzan a través de un listener específico. Cada contenedor de aplicaciones tiene un servicio por defecto con el mismo nombre que el contenedor de aplicaciones.

Finalidad de los contenedores de aplicación

De alguna manera, un contenedor de aplicaciones funciona como una CDB específica de la aplicación dentro de una CDB. Un contenedor de aplicaciones, como la propia CDB, puede incluir varias PDB y permite que estas PDB compartan metadatos y datos.

La raíz de la aplicación permite a las PDB de la aplicación compartir una aplicación, lo que en este contexto significa un juego con nombre y versiones de metadatos y datos comunes. Una aplicación típica instala los usuarios comunes de la aplicación, los objetos comunes vinculados a metadatos y los objetos comunes vinculados a datos.

Ventajas clave de los contenedores de aplicaciones

Los contenedores de aplicaciones proporcionan varias ventajas sobre el almacenamiento de cada aplicación en una PDB independiente.

Caso de uso de Application Container: SaaS

Un despliegue de SaaS puede utilizar varias PDB de aplicación, cada una para un cliente independiente, que comparten metadatos y datos.

En un entorno SaaS puro, la definición de la aplicación maestra reside en la raíz de la aplicación, pero los datos específicos del cliente residen en su propia PDB de aplicación. Por ejemplo, sales_app es el modelo de aplicación de la raíz de aplicación. La PDB de aplicación denominada cust1_pdb solo contiene datos de ventas para el cliente 1, mientras que la PDB de aplicación denominada cust2_pdb solo contiene datos de ventas para el cliente 2. El plugin, la desconexión, la clonación y otras operaciones de nivel de PDB están disponibles para PDB de clientes individuales.

Figura 1: Caso de uso de SaaS

Descripción de la ilustración cncpt389.png

Una configuración SaaS pura proporciona las siguientes ventajas:

Caso de uso de contenedores de aplicaciones: almacén de datos lógico

Un cliente puede utilizar varias PDB de aplicación para abordar problemas de soberanía de datos.

En un caso de uso de ejemplo, una compañía coloca datos específicos de cada trimestre financiero en una PDB independiente. Por ejemplo, el contenedor de aplicación denominado sales_ac incluye q1_2016_pdb, q2_2016_pdb, q3_2016_pdb y q4_2016_pdb. Puede definir cada transacción en la PDB correspondiente al trimestre asociado. Para generar un informe que agregue el rendimiento en un año, agregue en las cuatro PDB mediante la cláusula CONTAINERS().

Entre las ventajas de este diseño lógico de almacén se incluyen:

Raíz de Aplicación

Un contenedor de aplicación tiene exactamente una raíz de aplicación, que es el principal de las PDB de aplicación en el contenedor.

La propiedad de ser una raíz de aplicación se establece en el momento de la creación y no se puede cambiar. El único contenedor al que pertenece una raíz de aplicación es la raíz de CDB. Una raíz de aplicación es como la raíz de CDB de alguna forma y, como PDB, de otras formas:

Una raíz de aplicación difiere de la base de datos conectable raíz de CDB y la PDB estándar porque puede almacenar objetos comunes creados por el usuario, que se denominan objetos comunes de aplicación. Los objetos comunes de aplicación son accesibles para las PDB de aplicación conectadas a la raíz de la aplicación. Los objetos comunes de la aplicación no son visibles para la raíz de CDB, otras raíces de la aplicación o PDB que no pertenecen a la raíz de la aplicación.

Ejemplo 3-1 Creación de una raíz de aplicación

En este ejemplo, se conecta a la raíz de CDB como usuario común administrativo c##system. Cree un contenedor de aplicación denominado saas_sales_ac y, a continuación, abra la raíz de aplicación, que tiene el mismo nombre que el contenedor.

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

Defina el contenedor actual en saas_sales_ac y, a continuación, verifique que este contenedor es la raíz de la aplicación:

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

Para el contenedor de aplicaciones, especifique los dos parámetros siguientes en el espacio de nombres USERENV de la función SYS_CONTEXT.

SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT')
SYS_CONTEXT('USERENV', 'IS_APPLICATION_PDB')

El valor de SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT') en una raíz de aplicación es el siguiente:

SQL> select sys_context('USERENV', 'IS_APPLICATION_ROOT') from dual;

SYS_CONTEXT('USERENV','IS_APPLICATION_ROOT')
--------------------------------------------------------------------------------
YES

Tenga en cuenta que el valor de SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT') coincide con la columna APPLICATION_ROOT en la vista V$PDBS.

SQL> select application_root from v$pdbs where con_id=sys_context('USERENV', 'CON_ID');

APP
---
YES

PDB de Aplicación

Una PDB de aplicación es una PDB que reside en un contenedor de aplicación. Cada PDB de una CDB reside en cero o en un contenedor de aplicaciones.

Por ejemplo, el contenedor de aplicaciones saas_sales_ac puede soportar varios clientes, con cada aplicación cliente almacenando sus datos en una PDB independiente. Las PDB de la aplicación cust1_sales_pdb y cust2_sales_pdb pueden residir en saas_sales_ac, en cuyo caso no pertenecen a ningún otro contenedor de aplicación (aunque como PDB necesariamente también pertenecen a la raíz de CDB).

Cree una PDB de aplicación ejecutando CREATE PLUGGABLE DATABASE mientras está conectada a la raíz de la aplicación. Puede crear la PDB de aplicación a partir de una base de datos inicial, clonar una PDB o conectarse a una PDB desconectada. Al igual que una PDB conectada a la raíz de CDB, puede clonar, desconectar o borrar una PDB de aplicación. Sin embargo, una PDB de aplicación siempre debe pertenecer a una raíz de aplicación.

Valor inicial de aplicación

Un inicio de aplicación es una PDB opcional creada por el usuario dentro de un contenedor de aplicación. Un contenedor de aplicación tiene cero o un valor inicial de aplicación.

Un valor inicial de aplicación permite crear PDB de aplicación rápidamente. Tiene el mismo rol en el contenedor de aplicaciones que PDB$SEED en la propia CDB.

El nombre inicial de la aplicación es siempre application_container_name$SEED, donde application_container_name es el nombre del contenedor de aplicación. Por ejemplo, utilice la sentencia CREATE PDB ... AS SEED para crear saas_sales_ac$SEED en el contenedor de aplicación saas_sales_ac.

Objetos comunes de la aplicación

Un objeto común de aplicación es un objeto común creado dentro de una aplicación en una raíz de aplicación. Los objetos comunes están enlazados a datos o a metadatos.

Para un objeto común enlazado a datos, las PDB de la aplicación comparten un único juego de datos. Por ejemplo, una aplicación para el contenedor de aplicación saas_sales_ac se denomina saas_sales_app, tiene la versión 1.0 e incluye una tabla usa_zipcodes enlazada a datos. En este caso, las filas se almacenan una vez en la tabla de la raíz de la aplicación, pero son visibles en todas las PDB de la aplicación.

Para un objeto común enlazado a metadatos, las PDB de la aplicación solo comparten los metadatos, pero contienen diferentes juegos de datos. Por ejemplo, una tabla products enlazada a metadatos tiene la misma definición en cada PDB de aplicación, pero las filas en sí son específicas de la PDB. La PDB de aplicación denominada cust1pdb puede tener una tabla products que contenga libros, mientras que la PDB de aplicación denominada cust2pdb puede tener una tabla products que contenga partes automáticas.

Acerca de la Comúnidad en una CDB

Un fenómeno común definido en una CDB o raíz de aplicación es el mismo en todos los contenedores conectados a esta raíz.

Principios de Comúnidad

En una CDB, un fenómeno puede ser común dentro del contenedor del sistema (la propia CDB) o dentro de un contenedor de aplicación específico.

Por ejemplo, si crea una cuenta de usuario común mientras está conectado a CDB$ROOT, esta cuenta de usuario es común a todas las PDB y las raíces de aplicación de la CDB. Sin embargo, si crea una cuenta de usuario común de aplicación mientras está conectada a una raíz de aplicación, esta cuenta de usuario solo es común para las PDB de este contenedor de aplicaciones.

En el contexto de CDB$ROOT o una raíz de aplicación, los principios de comúnidad son los siguientes:

Espacios de nombres en una CDB

En una CDB, el espacio de nombres de cada objeto se limita a su contenedor.

Los siguientes principios resumen las reglas de ámbito:

Los principios anteriores tienen implicaciones para los fenómenos locales y comunes.

Fenómenos locales

Un fenómeno local debe tener un nombre único dentro de un contenedor, pero no en todos los contenedores de la CDB. Los fenómenos locales de nombre idéntico en diferentes contenedores son distintos. Por ejemplo, el usuario local sh en una PDB no entra en conflicto con el usuario local sh en otra PDB.

CDB$ROOT Fenómenos comunes

Los fenómenos comunes definidos en CDB$ROOT existen en varios contenedores y deben ser únicos en cada uno de estos espacios de nombres. Por ejemplo, la raíz de CDB incluye usuarios comunes predefinidos, como SYSTEM y SYS. Para garantizar la separación del espacio de nombres, Oracle AI Database impide la creación de un usuario SYSTEM en otro contenedor.

Para garantizar la separación del espacio de nombres, el nombre de los fenómenos comunes creados por el usuario en la raíz de CDB debe comenzar con el valor especificado por el parámetro de inicialización COMMON_USER_PREFIX. El prefijo por defecto es c## o C##. Los nombres de todos los fenómenos otros creados por el usuario no deben comenzar con c## o C##. Por ejemplo, no puede crear un usuario local en hrpdb denominado c##hr ni puede crear un usuario común en la raíz de CDB denominada hr.

Fenómenos comunes de aplicación

En un contenedor de aplicaciones, los nombres de fenómenos comunes locales y de aplicación no deben entrar en conflicto.

Consulte también: Guía de seguridad de Oracle AI Database para obtener más información sobre los usuarios y roles comunes

Creación de objetos comunes de aplicación

Para crear objetos comunes, conéctese a una raíz de aplicación y, a continuación, ejecute una sentencia CREATE que especifique un atributo compartido.

Solo puede crear o cambiar objetos comunes de la aplicación como parte de una instalación, actualización o parche de la aplicación. Puede especificar el uso compartido de las siguientes maneras:

En la siguiente tabla se muestran los tipos de objetos comunes de aplicación y dónde se almacenan los datos y metadatos.

Tabla 1 Objetos comunes de la aplicación

Tipo de objeto Valor de uso compartido Almacenamiento de metadatos Almacenamiento de datos
Vinculado a datos DATA Raíz de la aplicación Raíz de la aplicación
Enlazado a datos ampliados EXTENDED DATA Raíz de la aplicación Base de datos conectable de aplicación y raíz de aplicación
Metadatos enlazados METADATA Raíz de la aplicación PDB de aplicación

Consulte también: Guía de seguridad de Oracle AI Database para aprender a gestionar privilegios para objetos comunes

Objetos comunes de la aplicación enlazada a metadatos

Un enlace de metadatos es un objeto de diccionario que soporta la referencia a metadatos comunes compartidos por todas las PDB del contenedor de aplicaciones y la concesión de privilegios en ellos.

Al especificar el valor METADATA en la cláusula SHARING o el parámetro de inicialización DEFAULT_SHARING, se especifica un enlace a los metadatos de un objeto, denominado objeto común enlazado a metadatos. Los metadatos del objeto se almacenan una vez en la raíz de la aplicación.

Las tablas, las vistas y los objetos de código (como los procedimientos PL/SQL) pueden compartir metadatos. En este contexto, "metadata" incluye definiciones de columnas, restricciones, disparadores y código. Por ejemplo, si sales_mlt es una tabla común enlazada a metadatos, todas las PDB de la aplicación acceden a la misma definición de esta tabla, que se almacena en la raíz de la aplicación, mediante un enlace de metadatos. Las filas de sales_mlt son diferentes en cada PDB de aplicación, pero las definiciones de columna son las mismas.

Normalmente, la mayoría de los objetos de una aplicación estarán enlazados a metadatos. Por lo tanto, solo necesita mantener una definición de aplicación maestra. Este enfoque centraliza la gestión de la aplicación en varias PDB de aplicación.

Ejemplo 3-2 Creación de un objeto común enlazado a metadatos

En este ejemplo, el usuario SYSTEM se conecta al contenedor de aplicación saas_sales_ac. SYSTEM instala una aplicación denominada saas_sales_app en la versión 1.0. Esta aplicación crea una cuenta de usuario común denominada saas_sales_adm. El esquema contiene una tabla común enlazada a metadatos denominada 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';

Puede utilizar la sentencia ALTER PLUGGABLE DATABASE APPLICATION ... SYNC para sincronizar las PDB de la aplicación con el fin de utilizar la misma definición de aplicación maestra. De esta forma, cada PDB de aplicación tiene un enlace de metadatos con la tabla común saas_sales_adm.sales_mlt. El código de capa media que actualiza sales_mlt en la PDB denominada cust1_pdb agrega filas a esta tabla en cust1_pdb, mientras que el código de capa media que actualiza sales_mlt en cust2_pdb agrega filas a la copia de esta tabla en cust2_pdb. Solo se comparten los metadatos de la tabla, que se almacenan en la raíz de la aplicación. Nota: Oracle AI Database Security Guide para obtener más información sobre cómo funcionan los privilegios de objeto comúnmente otorgados

Enlaces de metadatos

Para los objetos comunes de la aplicación enlazada a metadatos, los metadatos del objeto se almacenan una vez en la raíz de la aplicación. Un enlace de metadatos es un objeto de diccionario cuyo tipo de objeto es el mismo que los metadatos que comparte.

La descripción de un enlace de metadatos se almacena en el diccionario de datos de la PDB en la que se crea. Un enlace de metadatos debe ser propiedad de un usuario común de la aplicación. Solo puede utilizar enlaces de metadatos para compartir metadatos de objetos comunes que son propiedad de su creador en la raíz de CDB o en una raíz de aplicación.

A diferencia de un enlace de datos, un enlace de metadatos solo depende de datos comunes. Por ejemplo, si una aplicación contiene las tablas locales dow_close_lt y nasdaq_close_lt en la raíz de la aplicación, un usuario común no puede crear enlaces de metadatos a estos objetos. Sin embargo, una tabla común de aplicación denominada sales_mlt puede estar enlazada a metadatos.

Si un usuario común con privilegios cambia los metadatos de sales_mlt, por ejemplo, agrega una columna a la tabla, este cambio se propaga a los enlaces de metadatos. Los usuarios de PDB de aplicación no pueden cambiar los metadatos en el enlace de metadatos. Por ejemplo, un DBA que gestiona la PDB de aplicación denominada cust1_pdb no puede agregar una columna a sales_mlt solo en esta PDB: dichos cambios de metadatos solo se pueden realizar en la raíz de la aplicación.

Objetos comunes de la aplicación enlazada a datos

Un objeto enlazado a datos es un objeto cuyos metadatos y datos residen en una raíz de aplicación y al que se puede acceder desde todas las PDB de aplicación de este contenedor de aplicación.

Al especificar el valor DATA en la cláusula SHARING o el parámetro de inicialización DEFAULT_SHARING, se especifica un enlace a un objeto común, denominado objeto común enlazado a datos. Las tablas de dimensiones de un almacén de datos suelen ser buenas candidatas para tablas comunes enlazadas a datos.

Un enlace de datos es un objeto de diccionario que funciona muy parecido a un sinónimo. Por ejemplo, si countries es una tabla común de aplicación, todas las PDB de aplicación acceden a la misma copia de esta tabla mediante un enlace de datos. Si se agrega una fila a esta tabla, esta fila estará visible en todas las PDB de la aplicación.

Un enlace de datos debe ser propiedad de un usuario común de la aplicación. El enlace hereda el tipo de objeto del objeto al que apunta. La descripción de un enlace de datos se almacena en el diccionario de la PDB en la que se crea. Por ejemplo, si un contenedor de aplicación contiene 10 PDB de aplicación y si cada PDB contiene un enlace a la tabla común de la aplicación countries, las 10 PDB contienen definiciones de diccionario para este enlace.

Ejemplo 3-3 Creación de un objeto enlazado a datos

En este ejemplo, SYSTEM se conecta al contenedor de aplicaciones saas_sales_ac. SYSTEM actualiza la aplicación denominada saas_sales_app de la versión 1.0 a 2.0. Esta actualización de la aplicación se conecta al contenedor como usuario común saas_sales_adm, crea una tabla enlazada a datos denominada countries_dlt y, a continuación, inserta filas en ella.

-- 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';

Utilice la sentencia ALTER PLUGGABLE DATABASE APPLICATION ... SYNC para sincronizar las PDB de aplicación con la raíz de aplicación. De esta forma, cada PDB de aplicación sincronizada tiene un enlace de datos a la tabla de enlaces de datos saas_sales_adm.countries_dlt.

Objetos de aplicación enlazados a datos ampliados

Un objeto enlazado a datos extendido es un híbrido de un objeto enlazado a datos y un objeto enlazado a metadatos.

En un objeto enlazado a datos ampliado, los datos almacenados en la raíz de la aplicación son comunes a todas las PDB de la aplicación y todas las PDB pueden acceder a estos datos. Sin embargo, cada PDB de aplicación puede crear sus propios datos específicos de PDB mientras comparte los datos comunes en la raíz de la aplicación. Por lo tanto, las PDB complementan los datos comunes con sus propios datos.

Por ejemplo, una aplicación de ventas puede soportar varias PDB de aplicación. Todas las PDB de aplicaciones necesitan los códigos postales de los Estados Unidos. En este caso, puede crear una tabla de enlaces de datos ampliada zipcodes_edt en la raíz de la aplicación. La raíz de la aplicación almacena los códigos postales de Estados Unidos para que todas las PDB de la aplicación puedan acceder a ellos. Sin embargo, una PDB de aplicación necesita los códigos postales de los Estados Unidos y Canadá. Esta PDB de aplicación puede almacenar los códigos postales de Canadá en el objeto enlazado a datos ampliado de la PDB de la aplicación en lugar de en la raíz de la aplicación.

Cree un objeto enlazado a datos ampliado conectándose a la raíz de la aplicación y especificando la palabra clave SHARING=EXTENDED DATA en la sentencia CREATE.

Ejemplo 3-4 Creación de un objeto de datos ampliados

En este ejemplo, SYSTEM se conecta al contenedor de aplicaciones saas_sales_ac y, a continuación, actualiza la aplicación denominada saas_sales_app (creada en el "Ejemplo 3-2") de la versión 2.0 a 3.0. Esta aplicación se conecta al contenedor como usuario común saas_sales_adm, crea una tabla enlazada a datos ampliada denominada zipcodes_edt y, a continuación, inserta filas en él.

-- 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';

Utilice la sentencia ALTER PLUGGABLE DATABASE APPLICATION ... SYNC para sincronizar las PDB de la aplicación con la aplicación. De esta forma, cada PDB de aplicación sincronizada tiene un enlace de datos a la tabla enlazada de datos saas_sales_adm.zipcodes_edt. Las aplicaciones que se conectan a estas PDB pueden ver los códigos postales que se han insertado en zipcodes_edt durante la actualización de la aplicación, pero también pueden insertar sus propios códigos postales en esta tabla.

Asignaciones de contenedores

Una asignación de contenedores permite que una sesión conectada a la raíz de aplicación emita sentencias SQL que se direccionen a la PDB adecuada, según el valor de un predicado utilizado en la sentencia SQL.

Una tabla de asignación especifica una columna en una tabla común enlazada a metadatos y utiliza particiones para asociar distintas PDB de aplicaciones con diferentes valores de columna. De esta forma, las asignaciones de contenedor permiten la partición de datos en el nivel de PDB cuando los datos no están particionados físicamente en el nivel de tabla.

Los componentes clave para utilizar mapas de contenedor son:

Ejemplo 3-5 Creación de una tabla enlazada a metadatos, una tabla de mapa y un mapa de contenedores: parte 1

En este ejemplo, se conecta como administrador de la aplicación a la raíz de la aplicación. Supongamos que un contenedor de aplicación tiene tres PDB de aplicación: amer_pdb, euro_pdb y asia_pdb. Cada PDB de aplicación almacena nombres de países para una región diferente. Una tabla enlazada a metadatos denominada oe.countries_mlt tiene una columna cname que almacena el nombre del país. Para esta estrategia de partición, utilice la partición por lista para crear un objeto de asignación denominado salesadm.pdb_map_tbl que cree una partición para cada región. El nombre del país determina la región.

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: Aunque cree asignaciones de contenedores con la sintaxis de partición, la base de datos no utiliza la funcionalidad de partición. La definición de una asignación de contenedor no necesita Oracle Partitioning.

En el script anterior, la sentencia ALTER TABLE oe.countries_mlt ENABLE CONTAINERS_DEFAULT especifica que las consultas y las sentencias DML emitidas en la raíz de la aplicación deben utilizar la cláusula CONTAINERS() por defecto para el objeto de base de datos.

Ejemplo 3-6 Sincronización de la aplicación y adición de datos: parte 2

Este ejemplo continúa con el ejemplo anterior. Mientras está conectado a la raíz de aplicación, cambia el contenedor actual a cada PDB, a su vez, sincroniza la aplicación saas_sales_app y, a continuación, agrega datos específicos de PDB a la tabla 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;

Ejemplo 3-7 Consulta de la tabla enlazada a metadatos: Parte 3

Este ejemplo continúa con el ejemplo anterior. Se conecta a la raíz de la aplicación y, a continuación, consulta oe.countries_mlt varias veces, especificando diferentes países en la cláusula WHERE. La consulta devuelve el valor correcto de la columna 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

Operaciones entre contenedores

Una operación entre contenedores es una sentencia DDL o DML que afecta a varios contenedores a la vez.

Solo un usuario común conectado a la raíz de CDB o a una raíz de aplicación puede realizar operaciones de contenedor cruzado. Una operación de contenedor cruzado puede afectar a:

Entre los ejemplos de operaciones DDL entre contenedores se incluyen el usuario SYSTEM que otorga un privilegio comúnmente a otro usuario común y una sentencia ALTER DATABASE . . . RECOVER que se aplica a toda la CDB.

Al conectarse a la raíz de CDB o a una raíz de aplicación, puede ejecutar una única sentencia DML para modificar tablas o vistas en varias PDB del contenedor. La base de datos infiere las PDB de destino del valor de la columna CON_ID especificada en la sentencia DML. Si no se especifica CON_ID, la base de datos utiliza la propiedad CONTAINERS_DEFAULT_TARGET especificada por la sentencia ALTER PLUGGABLE DATABASE CONTAINERS DEFAULT TARGET.

Ejemplo 3-8 Actualización de varias PDB en una única sentencia DML

En este ejemplo, su objetivo es definir la columna country_name en el valor USA de la tabla sh.sales. Esta tabla existe en dos PDB independientes, con los ID de contenedor 7 y 8. Ambas PDB están en el contenedor de aplicaciones denominado saas_sales_ac. Puede conectarse a la raíz de la aplicación como administrador y realizar la actualización de la siguiente manera:

CONNECT sales_admin@saas_sales_ac
Password: *******

UPDATE CONTAINERS(sh.sales) sal
  SET sal.country_name = 'USA'
  WHERE sal.CON_ID IN (7,8);

En la sentencia UPDATE anterior, sal es un alias para CONTAINERS(sh.sales).

Consulte también: "Cuentas de Usuario Comunes"