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.
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
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).
Arquivos .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
Interromper 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]
Select 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]
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.
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]
Prontooooooooo!!!
Bem, pessoal, espero que tenham gostado, quaisquer dúvidas e sugestões é só deixar nos comentários (: …. abraços !