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.