Using Application Common Objects

Neste artigo, vamos explorar os 3 tipos de Application Common Objects que podemos usar em nossa estrutura de Application Containers. Ainda baseados nos artigos anteriores, que fizemos a criação da estrutura mínima para viabilizar os testes que ocorrerão neste artigo.

Data-Linked Application Common Objects

Este tipo de objeto possui o seu metadados e dados armazenados em um Application Root, sendo acessíveis de todos os Application PDBs necessários. É ideal que as informações não sejam voláteis para a sua aplicação prática, ou seja, que não sofrem alterações (por exemplo, dados de CEP’s). A sua criação se dá com o parâmetro SHARING=DATA, conforme exemplo abaixo (objeto este que já criamos em artigos anteriores):

CREATE TABLE HR.REGIONS SHARING=DATA
(
  REGION_ID    NUMBER ,
  REGION_NAME  VARCHAR2(25 BYTE)
);

Vamos validar que os dados desse objeto são os mesmos, para os 2 Application PDBs criados em nosso ambiente laboratório:

[oracle@quiasma admin]$ sqlplus hr/oracle@//quiasma:1521/hr_pdb1.localdomain
 
SQL*Plus: Release 18.0.0.0.0 - Production on Tue Jul 6 20:41:13 2021
Version 18.13.0.0.0
 
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
 
Last Successful login time: Tue Jul 06 2021 20:02:14 -03:00
 
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
 
SQL> SELECT REGION_ID, REGION_NAME FROM REGIONS;
 
 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa
 
SQL> conn hr/oracle@//quiasma:1521/hr_pdb2.localdomain
Connected.
SQL> SELECT REGION_ID, REGION_NAME FROM REGIONS;
 
 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa
 
SQL>

Vemos que ao logar no Application PDB HR_PDB1 e tentar inserir dados na tabela, uma mensagem de erro é reportada pelo Oracle:

SQL> conn hr/oracle@//quiasma:1521/hr_pdb1.localdomain
Connected.
SQL> INSERT INTO REGIONS (REGION_ID,REGION_NAME) VALUES (101,'BSS');
INSERT INTO REGIONS (REGION_ID,REGION_NAME) VALUES (101,'BSS')
            *
ERROR at line 1:
ORA-65097: DML into a data link table is outside an application action
 
 
SQL>

Metadata-linked Application Common Objects

Neste tipo de objeto, apenas os metadados estão armazenados em um Application Root. Isso permite que múltiplos PDBs possuam a mesma estrutura (DDL) de um objeto, mas que os seus dados sejam diferentes. Para a sua definição, podemos usar o parâmetro SHARING=METADATA, conforme exemplo abaixo:

CREATE TABLE HR.DEPARTMENTS SHARING=METADATA
(
  DEPARTMENT_ID    NUMBER(4),
  DEPARTMENT_NAME  VARCHAR2(30 BYTE) ,
  MANAGER_ID       NUMBER(6),
  LOCATION_ID      NUMBER(4)
);

Logados no PDB HR_PDB1, vamos adicionar 2 registros na tabela mencionada acima:

SQL> conn hr/oracle@//quiasma:1521/hr_pdb1.localdomain
Connected.
SQL> INSERT INTO DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID) VALUES ('10', 'MANAGEMENT', NULL, 1000);
 
1 row created.
 
SQL> INSERT INTO HR.DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID) VALUES ('20', 'DEVELOPEMENT', NULL, 1000);
 
1 row created.
 
SQL> COMMIT;
 
Commit complete.
 
SQL> SELECT * FROM HR.DEPARTMENTS;
 
DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID LOCATION_ID
------------- ------------------------------ ---------- -----------
           10 MANAGEMENT                                       1000
           20 DEVELOPEMENT                                     1000

Já no PDB HR_PDB2, vamos adicionar outros 2 registros. Constatamos que um PDB não consegue ver os dados do outro:

SQL> conn hr/oracle@//quiasma:1521/hr_pdb2.localdomain
Connected.
SQL> INSERT INTO HR.DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID) VALUES ( '100', 'MANAGEMENT', NULL, 2000);
 
1 row created.
 
SQL> INSERT INTO HR.DEPARTMENTS (DEPARTMENT_ID, DEPARTMENT_NAME, MANAGER_ID, LOCATION_ID) VALUES ( '200', 'DEVELOPEMENT', NULL, 2000);
 
1 row created.
 
SQL> COMMIT;
 
Commit complete.
 
SQL> SELECT * FROM HR.DEPARTMENTS;
 
DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID LOCATION_ID
------------- ------------------------------ ---------- -----------
          100 MANAGEMENT                                       2000
          200 DEVELOPEMENT                                     2000

O interessante também é notar que não conseguimos, a partir do Application PDB, alterar a estrutura do objeto em questão:

SQL> ALTER TABLE DEPARTMENTS ADD ( NOTES VARCHAR2(100)) ;
ALTER TABLE DEPARTMENTS ADD ( NOTES VARCHAR2(100))
*
ERROR at line 1:
ORA-65274: operation not allowed from outside an application action

Extended Data-Linked Application Objects

Por último, o Extended Data-Linked é um modelo híbrido: os metadados e dados estão armazenados no Application Root, podendo ser acessados pelo Application PDBs, porém, cada PDB pode ir criando seus próprios dados. Isso é permitido a partir da instrução SHARING=EXTENDED DATA, conforme exemplo abaixo:

CREATE TABLE HR.LOCATIONS sharing=extended data
(
  LOCATION_ID     NUMBER(4),
  STREET_ADDRESS  VARCHAR2(40 BYTE),
  POSTAL_CODE     VARCHAR2(12 BYTE),
  CITY            VARCHAR2(30 BYTE) ,
  STATE_PROVINCE  VARCHAR2(25 BYTE),
  COUNTRY_ID      CHAR(2 BYTE)
);

Para simular o seu funcionamento, vamos logar no PDB HR_PDB1 e inserir um registro na tabela acima:

SQL> conn hr/oracle@//quiasma:1521/hr_pdb1.localdomain
Connected.
SQL> SELECT COUNT(*) FROM LOCATIONS;
 
  COUNT(*)
----------
        23
 
SQL> INSERT INTO LOCATIONS (LOCATION_ID, CITY, COUNTRY_ID) VALUES (9000, 'Man U.', 'UK') ;
 
1 row created.
 
SQL> COMMIT;
 
Commit complete.
 
SQL> SELECT COUNT(*) FROM LOCATIONS;
 
  COUNT(*)
----------
        24

Realizando o mesmo processo no HR_PDB2 (e já percebemos que o registro adicionado ao HR_PDB1 não é exibido ao nosso PDB vigente):

SQL> conn hr/oracle@//quiasma:1521/hr_pdb2.localdomain
Connected.
SQL> SELECT COUNT(*) FROM LOCATIONS;
 
  COUNT(*)
----------
        23
 
SQL> INSERT INTO LOCATIONS (LOCATION_ID, CITY, COUNTRY_ID) VALUES (9000, 'Man U.', 'UK') ;
 
1 row created.
 
SQL> COMMIT;
 
Commit complete.
 
SQL> SELECT COUNT(*) FROM LOCATIONS;
 
  COUNT(*)
----------
        24

Agora vamos tentar deletar um registro que foi adicionado no momento da criação do Application. Vemos que o mesmo não é deletado, uma vez que seu conteúdo pertence ao Application Root, e não ao Application PDB:

SQL> SELECT COUNT(*) FROM LOCATIONS WHERE LOCATION_ID=3200;
 
  COUNT(*)
----------
         1
 
SQL> DELETE LOCATIONS WHERE LOCATION_ID=3200;
 
0 rows deleted.

Por fim, vamos deletar o registro adicionado pelo Application PDB:

SQL> SELECT COUNT(*) FROM LOCATIONS WHERE LOCATION_ID=9000;
 
  COUNT(*)
----------
         1
 
SQL> DELETE LOCATIONS WHERE LOCATION_ID=9000;
 
1 row deleted.
 
SQL> COMMIT;
 
Commit complete.

Fonte: AQUI.

Obs: Este procedimento foi criado pelo senhor Ahmed Baraka (www.ahmedbaraka.com) e foi apenas reproduzido por mim em um laboratório pessoal para fins de aprendizado.

Leave a Comment

Your email address will not be published.