Contêineres de Aplicativos
Em um CDB, você pode criar um contêiner para dados de aplicativos e metadados que podem ser compartilhados por PDBs.
-
Sobre Contêineres de Aplicativos Um contêiner de aplicativos é um componente CDB opcional criado pelo usuário que armazena dados e metadados para um ou mais back-ends de aplicativos. Um CDB inclui zero ou mais contêineres de aplicativos.
-
Objetos Comuns do Aplicativo Um objeto comum do aplicativo é um objeto comum criado dentro de um aplicativo em uma raiz do aplicativo. Os objetos comuns são vinculados a dados ou a metadados.
-
Mapas de Contêiner Um mapa de contêiner permite que uma sessão conectada à raiz do aplicativo emita instruções SQL que são roteadas para o PDB apropriado, dependendo do valor de um predicado usado na instrução SQL.
-
Operações entre Contêineres Uma operação entre contêineres é uma instrução DDL ou DML que afeta vários contêineres de uma só vez. Consulte Também: Objetos Comuns e Locais para saber mais sobre objetos comuns do aplicativo
Sobre Contêineres de Aplicativos
Um contêiner de aplicativos é um componente CDB opcional criado pelo usuário que armazena dados e metadados para um ou mais back-ends de aplicativos. Um CDB inclui zero ou mais contêineres de aplicativos.
Em um contêiner de aplicativos, um aplicativo é o conjunto de dados e metadados comuns com controle de versão e nomeados armazenados na raiz do aplicativo. Neste contexto de um container de aplicativos, o termo "aplicativo" significa "definição de aplicativo mestre". Por exemplo, o aplicativo pode incluir definições de tabelas, visualizações e pacotes.
Por exemplo, você pode criar vários PDBs relacionados a vendas em um contêiner de aplicativos, com esses PDBs compartilhando um aplicativo que consiste em um conjunto de tabelas e definições de tabela comuns. Você pode armazenar vários PDBs relacionados a RH em um contêiner de aplicativos separado, com suas próprias tabelas e definições de tabela comuns.
A instrução CREATE PLUGGABLE DATABASE com a cláusula AS APPLICATION CONTAINER cria a raiz do aplicativo do contêiner de aplicativos e, portanto, cria implicitamente o próprio contêiner de aplicativos. Quando você cria o contêiner de aplicativos pela primeira vez, ele não contém PDBs. Para criar PDBs de aplicativo, conecte-se à raiz do aplicativo e execute a instrução CREATE PLUGGABLE DATABASE.
Na instrução CREATE PLUGGABLE DATABASE, você deve especificar um nome de contêiner (que seja igual ao nome da raiz do aplicativo), por exemplo, saas_sales_ac. O nome do contêiner de aplicativos deve ser exclusivo no CDB e dentro do escopo de todos os CDBs cujas instâncias são acessadas por meio de um listener específico. Cada contêiner de aplicativos tem um serviço padrão com o mesmo nome do contêiner de aplicativos.
-
Finalidade dos Contêineres de Aplicativos De algumas maneiras, um contêiner de aplicativos funciona como um CDB específico do aplicativo dentro de um CDB. Um contêiner de aplicativos, como o próprio CDB, pode incluir vários PDBs e permite que esses PDBs compartilhem metadados e dados.
-
Raiz do Aplicativo Um contêiner de aplicativos tem exatamente uma raiz do aplicativo, que é a mãe dos PDBs do aplicativo no contêiner.
-
PDBs de Aplicativo Um PDB de aplicativo é um PDB que reside em um contêiner de aplicativos. Cada PDB em um CDB reside em zero ou em um contêiner de aplicativos.
-
Implantação de Aplicativos Uma implantação de aplicativos é um PDB opcional criado pelo usuário em um contêiner de aplicativos. Um contêiner de aplicativos tem zero ou um seed de aplicativos.
Finalidade dos Contêineres de Aplicativos
De certa forma, um contêiner de aplicativos funciona como um CDB específico do aplicativo dentro de um CDB. Um contêiner de aplicativos, como o próprio CDB, pode incluir vários PDBs e permite que esses PDBs compartilhem metadados e dados.
A raiz do aplicativo permite que os PDBs do aplicativo compartilhem um aplicativo, que nesse contexto significa um conjunto com nome e controle de versão de metadados e dados comuns. Um aplicativo típico instala usuários comuns do aplicativo, objetos comuns vinculados a metadados e objetos comuns vinculados a dados.
-
Principais Benefícios dos Contêineres de Aplicativos Os contêineres de aplicativos fornecem vários benefícios sobre o armazenamento de cada aplicativo em um PDB separado.
-
Caso de Uso do Contêiner de Aplicativos: SaaS Uma implantação do SaaS pode usar vários PDBs de aplicativos, cada um para um cliente separado, que compartilham metadados e dados.
-
Caso de Uso de Contêineres de Aplicativos: Data Warehouse Lógico Um cliente pode usar vários PDBs de aplicativos para resolver problemas de soberania de dados.
Principais Benefícios dos Contêineres de Aplicativos
Os contêineres de aplicativos fornecem vários benefícios sobre o armazenamento de cada aplicativo em um PDB separado.
-
A raiz do aplicativo armazena metadados e dados que todos os PDBs de aplicativos podem compartilhar.
Por exemplo, todos os PDBs de aplicativos podem compartilhar dados em uma tabela central, como uma tabela listada como atribuições de aplicativo padrão. Além disso, todos os PDBs podem compartilhar uma definição de tabela à qual eles adicionam linhas específicas do PDB.
-
Você mantém sua definição de aplicativo mestre na raiz do aplicativo, em vez de manter uma cópia separada em cada PDB.
Se você fizer upgrade do aplicativo na raiz do aplicativo, as alterações serão automaticamente propagadas para todos os PDBs do aplicativo. O back-end do aplicativo pode conter o objeto comum vinculado a dados
app_roles, que é uma tabela que lista atribuições padrão:admin,manager,sales_repe assim por diante. Um usuário conectado a qualquer PDB de aplicativo pode consultar essa tabela. -
Um contêiner de aplicativos pode incluir uma implantação de aplicativos, PDBs de aplicativos e PDBs de proxy (que se referem a PDBs em outros CDBs).
-
Você pode criar rapidamente novos PDBs de aplicativos com base na implantação de aplicativos.
-
Você pode consultar views que reportam todos os PDBs no contêiner de aplicativos.
-
Ao se conectar à raiz do aplicativo, você pode usar a função
CONTAINERSpara executar DML em objetos em vários PDBs.Por exemplo, se a tabela
productsexistir em cada PDB do aplicativo, você poderá se conectar à raiz do aplicativo e consultar os produtos em todos os PDBs do aplicativo usando uma única instruçãoSELECT. -
Você pode desconectar um PDB de uma raiz de aplicativo e, em seguida, conectá-lo a uma raiz de aplicativo em uma release mais recente do banco de dados Oracle. Portanto, os PDBs são úteis em um upgrade de banco de dados Oracle.
Caso de Uso do Contêiner de Aplicativos: SaaS
Uma implantação do SaaS pode usar vários PDBs de aplicativos, cada um para um cliente separado, que compartilham metadados e dados.
Em um ambiente puro SaaS, a definição do aplicativo mestre reside na raiz do aplicativo, mas os dados específicos do cliente residem em seu próprio PDB do aplicativo. Por exemplo, sales_app é o modelo de aplicativo na raiz do aplicativo. O PDB do aplicativo chamado cust1_pdb contém dados de vendas somente para o cliente 1, enquanto o PDB do aplicativo chamado cust2_pdb contém dados de vendas somente para o cliente 2. Plugging, desplugging, clonagem e outras operações no nível do PDB estão disponíveis para PDBs de clientes individuais.
Figura 1: SaaS Caso de Uso

Descrição da ilustração cncpt389.png
Uma configuração pura do SaaS oferece os seguintes benefícios:
-
Desempenho
-
Segurança
-
Suporte para vários clientes
Os dados de cada cliente residem em seu próprio contêiner, mas são consolidados para que você possa gerenciar muitos clientes coletivamente. Esse modelo estende as economias de escala de gerenciamento de muitos como um para o administrador de aplicativos, não apenas para o DBA.
Caso de Uso de Contêineres de Aplicativos: Data Warehouse Lógico
Um cliente pode usar vários PDBs de aplicativos para resolver problemas de soberania de dados.
Em um exemplo de caso de uso, uma empresa coloca dados específicos de cada trimestre financeiro em um PDB separado. Por exemplo, o contêiner de aplicativos chamado sales_ac inclui q1_2016_pdb, q2_2016_pdb, q3_2016_pdb e q4_2016_pdb. Você define cada transação no PDB correspondente ao trimestre associado. Para gerar um relatório que agrega desempenho em um ano, você agrega nos quatro PDBs usando a cláusula CONTAINERS().
Os benefícios deste design de armazém lógico incluem:
-
ETL para dados específicos de um único PDB não afeta outros PDBs.
-
Os planos de execução são mais eficientes porque se baseiam na distribuição real de dados.
Raiz do Aplicativo
Um contêiner de aplicativos tem exatamente uma raiz de aplicativo, que é o pai dos PDBs de aplicativos no contêiner.
A propriedade de ser uma raiz de aplicativo é estabelecida no momento da criação e não pode ser alterada. O único contêiner ao qual uma raiz de aplicativo pertence é a raiz do CDB. Uma raiz de aplicativo é como a raiz do CDB de algumas maneiras e como um PDB de outras maneiras:
-
Assim como a raiz do CDB, uma raiz de aplicativo serve como contêiner pai para os PDBs conectados a ela. Quando conectado à raiz do aplicativo, você pode gerenciar usuários e privilégios comuns, criar PDBs do aplicativo, alternar contêineres e emitir DDL que se aplique a todos os PDBs no contêiner de aplicativos.
-
Como um PDB, você cria uma raiz de aplicativo com a instrução
CREATE PLUGGABLE DATABASE, a altera comALTER PLUGGABLE DATABASEe altera sua disponibilidade comSTARTUPeSHUTDOWN. Você pode usar DDL para conectar, desconectar e eliminar raízes de aplicativos. A raiz do aplicativo tem seu próprio nome de serviço, e os usuários podem se conectar à raiz do aplicativo da mesma forma que se conectam a um PDB.
Uma raiz de aplicativo difere da raiz do CDB e do PDB padrão porque ela pode armazenar objetos comuns criados pelo usuário, que são chamados de objetos comuns do aplicativo. Os objetos comuns do aplicativo podem ser acessados pelos PDBs do aplicativo conectados à raiz do aplicativo. Os objetos comuns do aplicativo não estão visíveis para a raiz do CDB, outras raízes do aplicativo ou PDBs que não pertencem à raiz do aplicativo.
Exemplo 3-1 Criando uma Raiz de Aplicativo
Neste exemplo, você faz log-in na raiz do CDB como usuário comum administrativo c##system. Você cria um contêiner de aplicativos chamado saas_sales_ac e, em seguida, abre a raiz do aplicativo, que tem o mesmo nome do contêiner.
-- 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 o contêiner atual como saas_sales_ac e verifique se esse contêiner é a raiz do aplicativo:
-- 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 o contêiner de aplicativos, especifique os dois parâmetros a seguir no namespace USERENV da função SYS_CONTEXT.
SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT')
SYS_CONTEXT('USERENV', 'IS_APPLICATION_PDB')
O valor de SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT') em uma raiz de aplicativo é o seguinte:
SQL> select sys_context('USERENV', 'IS_APPLICATION_ROOT') from dual;
SYS_CONTEXT('USERENV','IS_APPLICATION_ROOT')
--------------------------------------------------------------------------------
YES
Observe que o valor de SYS_CONTEXT('USERENV', 'IS_APPLICATION_ROOT') corresponde à coluna APPLICATION_ROOT na exibição V$PDBS.
SQL> select application_root from v$pdbs where con_id=sys_context('USERENV', 'CON_ID');
APP
---
YES
PDBs do Aplicativo
Um PDB de aplicativo é um PDB que reside em um contêiner de aplicativos. Cada PDB em um CDB reside em zero ou em um contêiner de aplicativos.
Por exemplo, o contêiner de aplicativos saas_sales_ac pode oferecer suporte a vários clientes, com cada aplicativo cliente armazenando seus dados em um PDB separado. Os PDBs de aplicativo cust1_sales_pdb e cust2_sales_pdb podem residir em saas_sales_ac; nesse caso, eles não pertencem a nenhum outro contêiner de aplicativos (embora, como PDBs, eles necessariamente pertençam também à raiz do CDB).
Crie um PDB de aplicativo executando CREATE PLUGGABLE DATABASE enquanto estiver conectado à raiz do aplicativo. Você pode criar o PDB do aplicativo com base em um seed ou clonar um PDB ou conectar um PDB desconectado. Como um PDB que está conectado à raiz do CDB, você pode clonar, desconectar ou eliminar um PDB do aplicativo. No entanto, um PDB de aplicativo sempre deve pertencer a uma raiz de aplicativo.
Pré-implantação do Aplicativo
Uma implantação de aplicativo é um PDB opcional criado pelo usuário em um contêiner de aplicativos. Um contêiner de aplicativos tem zero ou um seed de aplicativos.
Uma implantação de aplicativo permite criar PDBs de aplicativo rapidamente. Ele tem a mesma função no contêiner de aplicativos que o PDB$SEED serve no próprio CDB.
O nome pré-implantado do aplicativo é sempre application_container_name$SEED, em que application_container_name é o nome do contêiner de aplicativos. Por exemplo, use a instrução CREATE PDB ... AS SEED para criar o saas_sales_ac$SEED no contêiner de aplicativos saas_sales_ac.
Objetos Comuns do Aplicativo
Objeto comum de aplicativo é um objeto comum criado dentro de um aplicativo em uma raiz de aplicativo. Os objetos comuns são vinculados a dados ou a metadados.
Para um objeto comum vinculado a dados, os PDBs de aplicativos compartilham um único conjunto de dados. Por exemplo, um aplicativo para o contêiner de aplicativos saas_sales_ac é chamado saas_sales_app, tem a versão 1.0 e inclui uma tabela usa_zipcodes vinculada a dados. Nesse caso, as linhas são armazenadas uma vez na tabela na raiz do aplicativo, mas ficam visíveis em todos os PDBs do aplicativo.
Para um objeto comum vinculado a metadados, os PDBs de aplicativos compartilham apenas os metadados, mas contêm diferentes conjuntos de dados. Por exemplo, uma tabela products vinculada a metadados tem a mesma definição em cada PDB de aplicativo, mas as próprias linhas são específicas do PDB. O PDB do aplicativo chamado cust1pdb pode ter uma tabela products que contenha livros, enquanto o PDB do aplicativo chamado cust2pdb pode ter uma tabela products que contenha partes automáticas.
-
Sobre a Commonality em um CDB Um fenômeno comum definido em um CDB ou raiz de aplicativo é o mesmo em todos os contêineres conectados a essa raiz.
-
Criação de Objetos Comuns do Aplicativo Para criar objetos comuns, estabeleça conexão com uma raiz do aplicativo e execute uma instrução
CREATEque especifique um atributo de compartilhamento. -
Objetos Comuns do Aplicativo Vinculado a Metadados Um link de metadados é um objeto de dicionário que suporta referência a metadados comuns compartilhados por todos os PDBs no contêiner de aplicativos e concede privilégios neles.
-
Objetos Comuns do Aplicativo Vinculado a Dados Um objeto vinculado a dados é um objeto cujos metadados e dados residem em uma raiz do aplicativo e podem ser acessados em todos os PDBs do aplicativo neste contêiner de aplicativos.
-
Objetos de Aplicativo Vinculados a Dados Estendidos Um objeto vinculado a dados estendido é um híbrido de um objeto vinculado a dados e de um objeto vinculado a metadados. Consulte Também: "Objetos Comuns e Locais" para saber mais sobre objetos comuns
Sobre a Commonality em um CDB
Um fenômeno comum definido em um CDB ou raiz de aplicativo é o mesmo em todos os contêineres conectados a essa raiz.
-
Princípios de Commonality Em um CDB, um fenômeno pode ser comum dentro do contêiner do sistema (o próprio CDB) ou dentro de um contêiner de aplicativo específico.
-
Namespaces em um CDB Em um CDB, o namespace de cada objeto tem como escopo seu contêiner.
Princípios da Commonality
Em um CDB, um fenômeno pode ser comum no contêiner do sistema (o próprio CDB) ou em um contêiner de aplicativo específico.
Por exemplo, se você criar uma conta de usuário comum enquanto estiver conectado ao CDB$ROOT, essa conta de usuário será comum a todos os PDBs e raízes do aplicativo no CDB. No entanto, se você criar uma conta de usuário comum do aplicativo enquanto estiver conectado a uma raiz do aplicativo, essa conta de usuário só será comum aos PDBs nesse contêiner de aplicativos.
No contexto de CDB$ROOT ou de uma raiz de aplicação, os princípios de commonality são os seguintes:
-
Um fenômeno comum é o mesmo em todos os recipientes existentes e futuros.
Portanto, um usuário comum definido na raiz do CDB tem a mesma identidade em cada PDB conectado à raiz do CDB; um usuário comum definido em uma raiz do aplicativo tem a mesma identidade em cada PDB do aplicativo conectado a essa raiz do aplicativo. Em contraste, um fenômeno local tem como escopo exatamente um contêiner existente.
-
Somente um usuário comum pode alterar a existência de fenômenos comuns.
Mais precisamente, somente um usuário comum conectado à raiz do CDB ou a uma raiz do aplicativo pode criar, destruir ou modificar atributos de um usuário, função ou objeto comum ao contêiner atual.
Namespaces em um CDB
Em um CDB, o namespace de cada objeto tem como escopo seu contêiner.
Os seguintes princípios resumem as regras de escopo:
-
De uma perspectiva de aplicativo, um PDB é um banco de dados separado distinto de qualquer outro PDB.
-
Os fenômenos locais são criados dentro e restritos a um único recipiente.
Observação: Neste tópico, a palavra "fenômeno" significa "conta de usuário, função ou objeto de banco de dados".
-
Fenômenos comuns são definidos em uma raiz de CDB ou de aplicativo e existem em todos os PDBs que são ou serão conectados a essa raiz.
Os princípios precedentes têm implicações para fenômenos locais e comuns.
Fenômenos Locais
Um fenômeno local deve ser nomeado exclusivamente dentro de um contêiner, mas não entre todos os contêineres no CDB. Fenômenos locais identificados em diferentes recipientes são distintos. Por exemplo, o usuário local sh em um PDB não entra em conflito com o usuário local sh em outro PDB.
CDB$ROOT Fenômenos Comuns
Os fenômenos comuns definidos no CDB$ROOT existem em vários contêineres e devem ser exclusivos em cada um desses namespaces. Por exemplo, a raiz do CDB inclui usuários comuns predefinidos, como SYSTEM e SYS. Para garantir a separação do namespace, o Oracle AI Database impede a criação de um usuário SYSTEM em outro contêiner.
Para garantir a separação do namespace, o nome dos fenômenos comuns criados pelo usuário na raiz do CDB deve começar com o valor especificado pelo parâmetro de inicialização COMMON_USER_PREFIX. O prefixo padrão é c## ou C##. Os nomes de todos os outros fenômenos criados pelo usuário não devem começar com c## ou C##. Por exemplo, você não pode criar um usuário local em hrpdb chamado c##hr, nem pode criar um usuário comum na raiz do CDB chamado hr.
Fenômenos Comuns da Aplicação
Em um contêiner de aplicativos, os nomes de fenômenos comuns locais e de aplicativos não devem entrar em conflito.
-
Usuários e atribuições comuns do aplicativo
Os mesmos princípios se aplicam aos usuários comuns do aplicativo e aos usuários comuns do CDB. A diferença é que, para usuários comuns do CDB, o valor padrão para o prefixo de usuário comum é
c##ouC##, enquanto na raiz do aplicativo o valor padrão para o prefixo de usuário comum é a string vazia.A arquitetura multitenant pressupõe que você crie PDBs de aplicativo com base em uma raiz de aplicativo ou converta um aplicativo de tenant único em um aplicativo multitenant.
-
Objetos comuns do aplicativo
A arquitetura multitenant pressupõe que você crie objetos comuns do aplicativo na raiz do aplicativo. Posteriormente, você adiciona dados localmente nos PDBs do aplicativo. No entanto, o Oracle AI Database suporta a criação de tabelas locais em um PDB do aplicativo. Nesse caso, as tabelas locais residem no mesmo namespace que os objetos comuns do aplicativo no PDB do aplicativo.
Consulte Também: Oracle AI Database Security Guide para saber mais sobre usuários e atribuições comuns
Criação de Objetos Comuns do Aplicativo
Para criar objetos comuns, conecte-se a uma raiz do aplicativo e execute uma instrução CREATE que especifique um atributo de compartilhamento.
Você só pode criar ou alterar objetos comuns do aplicativo como parte de uma instalação, atualização ou patch do aplicativo. Você pode especificar o compartilhamento das seguintes maneiras:
-
Parâmetro de inicialização
DEFAULT_SHARINGA definição é o atributo de compartilhamento padrão para todos os objetos de banco de dados de um tipo suportado criados na raiz.
-
Cláusula
SHARINGVocê especifica essa cláusula na própria instrução
CREATE. Quando uma cláusulaSHARINGé incluída em uma instrução SQL, ela tem precedência sobre o valor especificado no parâmetro de inicializaçãoDEFAULT_SHARING. Os valores possíveis sãoMETADATA,DATA,EXTENDED DATAeNONE.
A tabela a seguir mostra os tipos de objetos comuns do aplicativo e onde os dados e os metadados são armazenados.
Tabela 1 Objetos Comuns do Aplicativo
| Tipo de Objeto | Valor de compartilhamento | Armazenamento de Metadados | Armazenamento de Dados |
|---|---|---|---|
| Vinculado a Dados | DATA |
Raiz do aplicativo | Raiz do aplicativo |
| Vinculado a Dados Estendidos | EXTENDED DATA |
Raiz do aplicativo | PDB da raiz e do aplicativo |
| Vinculado a Metadados | METADATA |
Raiz do aplicativo | Aplicativo PDB |
Consulte Também: Oracle AI Database Security Guide para aprender a gerenciar privilégios de objetos comuns
Objetos Comuns do Aplicativo Vinculado a Metadados
Um link de metadados é um objeto de dicionário que suporta referência e concessão de privilégios em metadados comuns compartilhados por todos os PDBs no contêiner de aplicativos.
A especificação do valor METADATA na cláusula SHARING ou no parâmetro de inicialização DEFAULT_SHARING especifica um link para os metadados de um objeto, chamado objeto comum vinculado a metadados. Os metadados do objeto são armazenados uma vez na raiz do aplicativo.
Tabelas, views e objetos de código (como procedimentos PL/SQL) podem compartilhar metadados. Neste contexto, "metadados" inclui definições de coluna, restrições, triggers e código. Por exemplo, se sales_mlt for uma tabela comum vinculada a metadados, todos os PDBs de aplicativos acessarão a mesma definição dessa tabela, que é armazenada na raiz do aplicativo, por meio de um link de metadados. As linhas no sales_mlt são diferentes em cada PDB do aplicativo, mas as definições de coluna são as mesmas.
Normalmente, a maioria dos objetos em um aplicativo será vinculada a metadados. Assim, você só precisa manter uma definição de aplicativo mestre. Essa abordagem centraliza o gerenciamento do aplicativo em vários PDBs de aplicativos.
Exemplo 3-2 Criando um Objeto Comum Vinculado a Metadados
Neste exemplo, o usuário SYSTEM faz log-in no contêiner de aplicativos saas_sales_ac. O SYSTEM instala um aplicativo chamado saas_sales_app na versão 1.0. Este aplicativo cria uma conta de usuário comum chamada saas_sales_adm. O esquema contém uma tabela comum vinculada a metadados chamada 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';
Você pode usar a instrução ALTER PLUGGABLE DATABASE APPLICATION ... SYNC para sincronizar os PDBs do aplicativo para usar a mesma definição de aplicativo mestre. Dessa forma, cada PDB de aplicativo tem um link de metadados para a tabela comum saas_sales_adm.sales_mlt. O código de camada intermediária que atualiza sales_mlt no PDB chamado cust1_pdb adiciona linhas a essa tabela em cust1_pdb, enquanto o código de camada intermediária que atualiza sales_mlt em cust2_pdb adiciona linhas à cópia dessa tabela em cust2_pdb. Somente os metadados da tabela, que são armazenados na raiz do aplicativo, são compartilhados. Observação: Oracle AI Database Security Guide para saber mais sobre como funcionam os privilégios de objeto comumente concedidos
- Links de Metadados Para objetos comuns do aplicativo vinculados a metadados, os metadados do objeto são armazenados uma vez na raiz do aplicativo. Um link de metadados é um objeto de dicionário cujo tipo de objeto é igual aos metadados que ele está compartilhando.
Links de Metadados
Para objetos comuns do aplicativo vinculados a metadados, os metadados do objeto são armazenados uma vez na raiz do aplicativo. Um link de metadados é um objeto de dicionário cujo tipo de objeto é igual aos metadados que ele está compartilhando.
A descrição de um link de metadados é armazenada no dicionário de dados do PDB no qual ele é criado. Um link de metadados deve pertencer a um usuário comum do aplicativo. Você só pode usar links de metadados para compartilhar metadados de objetos comuns pertencentes ao seu criador na raiz do CDB ou em uma raiz do aplicativo.
Diferentemente de um link de dados, um link de metadados depende somente de dados comuns. Por exemplo, se um aplicativo contiver as tabelas locais dow_close_lt e nasdaq_close_lt na raiz do aplicativo, um usuário comum não poderá criar links de metadados para esses objetos. No entanto, uma tabela comum de aplicativo chamada sales_mlt pode ser vinculada a metadados.
Se um usuário comum com privilégios alterar os metadados para sales_mlt, por exemplo, adicionar uma coluna à tabela, essa alteração será propagada para os links de metadados. Os usuários do PDB do aplicativo não podem alterar os metadados no link de metadados. Por exemplo, um DBA que gerencia o PDB do aplicativo chamado cust1_pdb não pode adicionar uma coluna a sales_mlt neste PDB somente: essas alterações de metadados só podem ser feitas na raiz do aplicativo.
Objetos Comuns do Aplicativo Vinculado a Dados
Um objeto vinculado a dados é um objeto cujos metadados e dados residem em uma raiz de aplicativo e podem ser acessados em todos os PDBs de aplicativo neste contêiner de aplicativos.
A especificação do valor DATA na cláusula SHARING ou no parâmetro de inicialização DEFAULT_SHARING especifica um link para um objeto comum, chamado objeto comum vinculado a dados. As tabelas de dimensão em um data warehouse geralmente são boas candidatas para tabelas comuns vinculadas a dados.
Um link de dados é um objeto de dicionário que funciona de forma semelhante a um sinônimo. Por exemplo, se countries for uma tabela comum de aplicativo, todos os PDBs de aplicativo acessarão a mesma cópia dessa tabela por meio de um link de dados. Se uma linha for adicionada a essa tabela, ela ficará visível em todos os PDBs de aplicativos.
Um link de dados deve pertencer a um usuário comum do aplicativo. O link herda o tipo de objeto do objeto para o qual está apontando. A descrição de um link de dados é armazenada no dicionário do PDB no qual ele é criado. Por exemplo, se um contêiner de aplicativos contiver 10 PDBs de aplicativos e cada PDB contiver um link para a tabela comum do aplicativo countries, todos os 10 PDBs conterão definições de dicionário para esse link.
Exemplo 3-3 Criando um Objeto Vinculado a Dados
Neste exemplo, o SYSTEM se conecta ao contêiner de aplicativos saas_sales_ac. SYSTEM faz upgrade do aplicativo chamado saas_sales_app da versão 1.0 para 2.0. Este upgrade do aplicativo faz log-in no contêiner como usuário comum saas_sales_adm, cria uma tabela vinculada a dados chamada countries_dlt e, em seguida, insere linhas nele.
-- 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';
Use a instrução ALTER PLUGGABLE DATABASE APPLICATION ... SYNC para sincronizar PDBs de aplicativo com a raiz do aplicativo. Dessa forma, cada PDB de aplicativo sincronizado tem um link de dados para a tabela vinculada a dados saas_sales_adm.countries_dlt.
Objetos de Aplicativo Vinculados a Dados Estendidos
Um objeto vinculado a dados estendido é um híbrido de um objeto vinculado a dados e de um objeto vinculado a metadados.
Em um objeto vinculado a dados estendidos, os dados armazenados na raiz do aplicativo são comuns a todos os PDBs do aplicativo, e todos os PDBs podem acessar esses dados. No entanto, cada PDB do aplicativo pode criar seus próprios dados específicos do PDB enquanto compartilha os dados comuns na raiz do aplicativo. Assim, os PDBs complementam os dados comuns com seus próprios dados.
Por exemplo, um aplicativo de vendas pode suportar vários PDBs de aplicativo. Todos os PDBs do aplicativo precisam dos códigos postais para os Estados Unidos. Nesse caso, você pode criar uma tabela estendida vinculada a dados zipcodes_edt na raiz do aplicativo. A raiz do aplicativo armazena os códigos postais dos Estados Unidos, para que todos os PDBs do aplicativo possam acessá-los. No entanto, um PDB de aplicativo requer os códigos postais para os Estados Unidos e o Canadá. Este PDB de aplicativo pode armazenar os códigos postais do Canadá no objeto vinculado a dados estendidos no PDB do aplicativo, em vez de na raiz do aplicativo.
Crie um objeto vinculado a dados estendidos conectando-se à raiz do aplicativo e especificando a palavra-chave SHARING=EXTENDED DATA na instrução CREATE.
Exemplo 3-4 Criando um Objeto de Dados Estendido
Neste exemplo, SYSTEM se conecta ao contêiner de aplicativos saas_sales_ac e, em seguida, faz upgrade do aplicativo chamado saas_sales_app (criado no "Exemplo 3-2") da versão 2.0 para 3.0. Esse aplicativo efetua log-in no contêiner como usuário comum saas_sales_adm, cria uma tabela estendida vinculada a dados chamada zipcodes_edt e, em seguida, insere linhas nela.
-- 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';
Use a instrução ALTER PLUGGABLE DATABASE APPLICATION ... SYNC para sincronizar PDBs de aplicativo com o aplicativo. Dessa forma, cada PDB de aplicativo sincronizado tem um link de dados para a tabela vinculada a dados saas_sales_adm.zipcodes_edt. Os aplicativos que se conectam a esses PDBs podem ver os códigos postais que foram inseridos no zipcodes_edt durante o upgrade do aplicativo, mas também podem inserir seus próprios códigos postais nessa tabela.
Mapas de Contêiner
Um mapa de contêiner permite que uma sessão conectada à raiz do aplicativo emita instruções SQL que são roteadas para o PDB apropriado, dependendo do valor de um predicado usado na instrução SQL.
Uma tabela de mapa especifica uma coluna em uma tabela comum vinculada a metadados e usa partições para associar diferentes PDBs de aplicativos a diferentes valores de coluna. Dessa forma, os mapas de contêiner permitem o particionamento de dados no nível do PDB quando os dados não são fisicamente particionados no nível da tabela.
Os principais componentes para usar mapas de contêineres são:
-
Tabela vinculada a metadados
Esta tabela deve ser consultada usando o mapa de contêineres. Por exemplo, você pode criar uma tabela vinculada a metadados chamada
countries_mltque armazena diferentes dados em cada PDB do aplicativo. Emamer_pdb, a colunacountries_mlt.cnamearmazena nomes de países da América do Norte; emeuro_pdb, a colunacountries_mlt.cnamearmazena nomes de países europeus; e emasia_pdb, a colunacountries_mlt.cnamearmazena nomes de países asiáticos. -
Tabela de mapas
Na raiz do aplicativo, você cria uma tabela de mapa de coluna única particionada por lista, hash ou intervalo. A tabela de mapa permite que a tabela vinculada a metadados seja consultada usando a estratégia de particionamento ativada pelo mapa de contêineres. Os nomes das partições na tabela de objetos do mapa devem corresponder aos nomes dos PDBs do aplicativo no contêiner de aplicativos.
Por exemplo, a tabela de mapas chamada
pdb_map_tblpode particionar por lista na colunacname. As partições denominadasamer_pdb,euro_pdbeasia_pdbcorrespondem aos nomes dos PDBs do aplicativo. Os valores em cada partição são os nomes dos países, por exemplo,PARTITION amer_pdb VALUES ('US','MEXICO','CANADA').A partir do Oracle Database 18c, para que uma consulta
CONTAINERS()use um mapa, a coluna de particionamento na tabela de mapas não precisa corresponder a uma coluna na tabela vinculada a metadados. Suponha que a tabelash.salesesteja ativada para o mapa de contêinerpdb_map_tblecnameseja a coluna de particionamento da tabela de mapa. Embora osh.salesnão inclua uma colunacname, a tabela de mapas roteia a seguinte consulta para o PDB apropriado:SELECT * FROM CONTAINERS(sh.sales) WHERE cname = 'US' ORDER BY time_id. -
Mapa de contêineres
Um mapa de contêiner é uma propriedade de banco de dados que especifica uma tabela de mapa. Para definir a propriedade, você se conecta à raiz do aplicativo e executa a instrução
ALTER PLUGGABLE DATABASE SET CONTAINER_MAP=map_table, em quemap_tableé o nome da tabela de mapas.
Exemplo 3-5 Criando uma Tabela Vinculada a Metadados, uma Tabela de Mapas e um Mapa de Contêiner: Parte 1
Neste exemplo, você faz login como administrador de aplicativos na raiz do aplicativo. Suponha que um contêiner de aplicativos tenha três PDBs de aplicativos: amer_pdb, euro_pdb e asia_pdb. Cada PDB de aplicativo armazena nomes de países para outra região. Uma tabela vinculada a metadados chamada oe.countries_mlt tem uma coluna cname que armazena o nome do país. Para essa estratégia de particionamento, você usa a partição por lista para criar um objeto de mapa chamado salesadm.pdb_map_tbl que cria uma partição para cada região. O nome do país determina a região.
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';
Observação: Embora você crie mapas de contêiner usando a sintaxe de particionamento, o banco de dados não usa a funcionalidade de particionamento. A definição de um mapa de contêiner não requer o Oracle Partitioning.
No script anterior, a instrução ALTER TABLE oe.countries_mlt ENABLE CONTAINERS_DEFAULT especifica que as consultas e instruções DML emitidas na raiz do aplicativo devem usar a cláusula CONTAINERS() por padrão para o objeto de banco de dados.
Exemplo 3-6 Sincronizando o Aplicativo e Adicionando Dados: Parte 2
Este exemplo continua do exemplo anterior. Ao se conectar à raiz do aplicativo, você alterna o contêiner atual para cada PDB, sincroniza o aplicativo saas_sales_app e, em seguida, adiciona dados específicos do PDB à tabela 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;
Exemplo 3-7 Consultando a Tabela Vinculada a Metadados: Parte 3
Este exemplo continua do exemplo anterior. Você se conecta à raiz do aplicativo e, em seguida, consulta oe.countries_mlt várias vezes, especificando diferentes países na cláusula WHERE. A consulta retorna o valor correto da coluna 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
Operações entre Contêineres
Uma operação entre contêineres é uma instrução DDL ou DML que afeta vários contêineres de uma só vez.
Somente um usuário comum conectado à raiz do CDB ou a uma raiz do aplicativo pode executar operações entre contêineres. Uma operação de contêiner cruzado pode afetar:
-
O próprio CDB
-
Vários contêineres dentro de um CDB
-
Vários fenômenos, como usuários comuns ou funções comuns que são representadas em vários contêineres
-
Um contêiner ao qual o usuário que emite a instrução DDL ou DML não está conectado no momento
Exemplos de operações DDL entre contêineres incluem o usuário SYSTEM, que concede um privilégio comumente a outro usuário comum, e uma instrução ALTER DATABASE . . . RECOVER que se aplica a todo o CDB.
Quando estiver conectado à raiz do CDB ou a uma raiz do aplicativo, você poderá executar uma única instrução DML para modificar tabelas ou views em vários PDBs no contêiner. O banco de dados infere os PDBs de destino do valor da coluna CON_ID especificada na instrução DML. Se nenhuma CON_ID for especificada, o banco de dados usará a propriedade CONTAINERS_DEFAULT_TARGET especificada pela instrução ALTER PLUGGABLE DATABASE CONTAINERS DEFAULT TARGET.
Exemplo 3-8 Atualizando Vários PDBs em uma Única Instrução DML
Neste exemplo, sua meta é definir a coluna country_name como o valor USA na tabela sh.sales. Esta tabela existe em dois PDBs separados, com IDs de contêiner 7 e 8. Ambos os PDBs estão no contêiner de aplicativos chamado saas_sales_ac. Você pode se conectar à raiz do aplicativo como administrador e fazer a atualização da seguinte forma:
CONNECT sales_admin@saas_sales_ac
Password: *******
UPDATE CONTAINERS(sh.sales) sal
SET sal.country_name = 'USA'
WHERE sal.CON_ID IN (7,8);
Na instrução UPDATE anterior, sal é um alias para CONTAINERS(sh.sales).
Consulte Também: "Contas de Usuário Comuns"