Banco de Dados

22 jul, 2013

Conexão e replicação de dados em banco de dados distribuídos heterogêneos – Parte 02

Publicidade

Olá, pessoal! No artigo passado, comecei a demonstração de como realizar a conexão e a replicação de dados entre banco de dados distribuídos heterogêneos. Estamos usando os bancos de dados Oracle 10G, Postgre e MySQL, nos quais utilizaremos o Oracle como middleware (mediador).

Dando continuidade a isso, hoje vamos fazer as configurações necessárias para a conexão e a replicação dos dados em nossos bancos de dados.

Configurando arquivos Oracle

Abra os arquivos listener.ora e tnsnames.ora, ambos localizados no diretório C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN e configure o arquivo listener.ora como na imagem a seguir.

banco_de_dados_1Arquivo listener.ora

Linhas a serem adicionadas ao arquivo

[sql]

(SID_DESC =
(SID_NAME = root)
(ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
(PROGRAM = hsodbc)
(HS=OK)
)
(SID_DESC =
(SID_NAME = postgres)
(ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
(PROGRAM = hsodbc)
(HS=OK)
)

[/sql]

Obs: o parâmetro SID_NAME deve conter o valor do nome de usuário do seu banco de dados MySQL (root) e Postgre (postgres).

Configure o arquivo tsnames.ora como a figura 5.9

banco_de_dados_2Arquivo tsnames.ora

Linhas a serem adicionadas ao arquivo

[sql]

ORACLE_MYSQL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = root)
)
(HS=OK)
)

ORACLE_POSTGRE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = postgres)
)
(HS=OK)
)

[/sql]

Criando arquivos init Oracle

Agora é necessário criar um arquivo init para cada usuário que iremos utilizar nos bancos de dados, ou seja, um arquivo para o usuário root (MySQL) e um arquivo para o usuário postgres (Postgre). O arquivo deverá chamar-se initNomeUsuario.ora (initroot.ora e initpostgres.ora).

banco_de_dados_3

Arquivos .ora.

banco_de_dados_4Arquivo initroot.ora

banco_de_dados_5Arquivo initpostgres.ora

OBS: HS_FDS_CONNECT_INFO deve conter o nome da conexão configurada no driver ODBC.

Após feitas as configurações, interrompa e inicie o banco de dados Oracle.

1 – Menu Iniciar => Todos os Programas => Oracle Database 10g Express Edition => Interromper Banco de Dados.

2 – Menu Iniciar => Todos os Programas => Oracle Database 10g Express Edition => Iniciar Banco de Dados

banco_de_dados_6Interromper e iniciar banco de dados Oracle

Criando database link Oracle e MySQL

Agora vamos fazer a conexão entre o Oracle e o MySQL. Para isso, utilizaremos o comando a seguir.

[sql]

CREATE DATABASE LINK "conMySQL"
CONNECT TO "root"
IDENTIFIED BY "root"
USING ‘ORACLE_MYSQL’
[/sql]

Linha 1 – nome do link.
Linha 2 – nome  de usuário do banco MySQL
Linha 3 – senha usuário do banco MySQL
Linha 4 – o nome dado à conexão de fonte de dados de sistema

Agora é possível listar os dados do banco MySQL através do ORACLE com o seguinte comando:

[sql]

SELECT * FROM clientes@conMYSQL;

[/sql]

banco_de_dados_7Select do Oracle em banco de dados MySQL

Criando database link Oracle e Postgre

O seguinte comando é utilizado para fazer a criação de um link entre os banco de dados Oracle e Postgre.

[sql]

CREATE DATABASE LINK "conPOSTGRE"
CONNECT TO "postgres"
IDENTIFIED BY "root"
USING ‘ORACLE_POSTGRE’

[/sql]

Linha 1 – nome do link.
Linha 2 – nome  de usuário do banco Postgre
Linha 3 – senha usuário do banco Postgre
Linha 4 – o nome dado à conexão de fonte de dados de sistema

Agora é possível listar os dados do banco Postgre através do ORACLE com o seguinte comando:

[sql]

SELECT * FROM categorias@conPOSTGRE;

[/sql]

banco_de_dados_8

Figura 1.15 – Select do Oracle em banco de dados Postgre
Fonte: Elaborada pelos autores, 2012.

Criando sinônimos

Podemos criar sinônimos a fim de facilitar o gerenciamento das tabelas.

[sql]

CREATE SYNONYM clientesMYSQL FOR clientes@conMYSQL;
CREATE SYNONYM categoriasPOSTGRE FOR categorias@conPOSTGRE;

[/sql]

Agora é possível gerenciar as tabelas do banco de dados MySQL e Postgre referenciando-as como clientesMYSQL e categoriasPOSTGRE, em vez de clientes@conMYSQL e categorias@conPOSTGRE, respectivamente.

banco_de_dados_9Select Usando Sinônimos

Procedures e triggers Oracle e MySQL

Para que haja consistência dos dados da tabela clientes (incluída em ambos banco de dados, Oracle e MySQL), utilizaremos PROCEDURES e TRIGGERS replicando assim todos os INSERTS, DELETES e UPDATES realizados nessa tabela. Dessa forma, todos os registros incluídos na tabela clientes Oracle estarão contidos na tabela clientes MySQL.

Procedure e Trigger INSERT

O código abaixo refere-se à procedure chamada procINSERT, que recebe 3 valores via parâmetro e insere-os na tabela clientes (MySQL).

[sql]

CREATE OR REPLACE PROCEDURE procINSERT(i NUMBER, n VARCHAR2, c VARCHAR2)
AS PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO clientesMYSQL VALUES(i, n, c);
COMMIT;
END;/
[/sql]

O código abaixo refere-se à trigger chamada tgINSERT, que chama a procedure procINSERT sempre após inserir um registro na tabela clientes (Oracle).

[sql]

CREATE OR REPLACE TRIGGER tgINSERT
AFTER INSERT ON clientes
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW

BEGIN
procINSERT(:NEW.idCliente, :NEW.nome, :NEW.cpf);
END;
/

[/sql]

Procedure e Trigger DELETE

O código abaixo refere-se à procedure chamada procDELETE, que recebe 1 valor via parâmetro (idCliente) e remove o registro da tabela clientes (MySQL)

[sql]

CREATE OR REPLACE PROCEDURE procDELETE(i NUMBER)
AS PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
DELETE FROM clientesMYSQL WHERE "idCliente" = i;
COMMIT;
END;/

[/sql]

O código abaixo refere-se à trigger chamada tgDELETE, que chama a procedure procDELETE sempre após deletar um registro na tabela clientes (Oracle).

[sql]

CREATE OR REPLACE TRIGGER tgDELETE
AFTER DELETE ON clientes
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
procDELETE(:OLD.idCliente);
END;
/

[/sql]

Procedure e Trigger UPDATE

O código abaixo refere-se à procedure chamada procUPDATE, que recebe 4 valores via parâmetro e atualiza o registro da tabela clientes (MySQL).

[sql]

CREATE OR REPLACE PROCEDURE procUPDATE(io NUMBER, i NUMBER, n VARCHAR2, c VARCHAR2)

AS PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN
UPDATE clientesMYSQL SET
"idCliente" = i, "nome" = n, "cpf" = c
WHERE "idCliente" = io ;
COMMIT;
END;
/

[/sql]

O código abaixo refere-se à trigger chamada tgUPDATE, que chama a procedure procUPDATE sempre após atualizar um registro na tabela clientes (Oracle).

[sql]

CREATE OR REPLACE TRIGGER tgUPDATE
AFTER UPDATE ON clientes
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
procUPDATE(:OLD.idCliente,:NEW.idCliente,:NEW.nome, :NEW.cpf);
END;
/
[/sql]

 Select Oracle e Postgre

O comando abaixo faz a listagem do nome do filme (banco de dados filmes Oracle) e do nome da categoria do filme (banco de dados categoria Postgre).

[sql]

SELECT f.nome,
(SELECT c."nome" FROM categoriasPOSTGRE c
WHERE f.idCategoria = c."idCategoria") AS
categoria FROM filmes f ;

[/sql]

banco_de_dados_10Select Oracle e Postgre

Prontooooooooo!!!

Bem, pessoal, espero que tenham gostado, quaisquer dúvidas e sugestões é só deixar nos comentários (: …. abraços !