Replicação de Dados no Interbase



Documentos relacionados
Replicação de Dados com InterBase/Firebird

APOSTILA BANCO DE DADOS INTRODUÇÃO A LINGUAGEM SQL

Triggers em PostgreSQL. Linguagem de Programação de Banco de Dados. Triggers em PostgreSQL. Triggers em PostgreSQL

Sistemas de Informação

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

DESENVOLVIMENTO DE SOFTWARE

A linguagem SQL

ADMINISTRAÇÃO DE BANCOS DE DADOS MÓDULO 13

Sistemas Operacionais. Prof. André Y. Kusumoto

Autor: Tiago Lone Nível: Básico Criação: 19/12/2005 Última versão: 18/12/2006. PdP. Pesquisa e Desenvolvimento de Produtos

Trabalhando com conexão ao banco de dados MySQL no Lazarus. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

SQL Linguagem de Definição de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Introdução a Banco de Dados Aula 03. Prof. Silvestri

Modelo Cliente/Servidor Por HIARLY ALVES

LINGUAGEM SQL. DML - Linguagem de Manipulação de Dados

Sumário. Administração de Banco de dados Módulo 12. Ilustração Backup-Recovery. Recuperação (Recovery) - Definição

Tarefa Orientada 18 Procedimentos armazenados

Linguagem de Consulta - SQL

Banco de Dados. Um momento crucial na organização dos dados é a forma com que cadastramos estes dados, a estrutura de armazenamento que criamos.

Banco de Dados Avançados Banco de Dados Ativo

CADERNOS DE INFORMÁTICA Nº 1. Fundamentos de Informática I - Word Sumário

Manual Replicação Manual VPN

LINGUAGEM SQL PARA CONSULTAS EM MICROSOFT ACCESS

UNIVERSIDADE FEDERAL DO AMAPÁ PRÓ REITORIA DE ADMINISTRAÇÃO E PLANEJAMENTO DEPARTAMENTO DE INFORMÁTICA. Manual do Moodle- Sala virtual

Programação SQL. Introdução

BD Oracle. Licenciatura em Engenharia Informática e Computação. Bases de Dados 2003/04

Bases de Dados 2007/2008. Aula 8

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

UNINGÁ UNIDADE DE ENSINO SUPERIOR INGÁ FACULDADE INGÁ CIÊNCIA DA COMPUTAÇÃO CURSORS. Profº Erinaldo Sanches Nascimento

Laboratório de Banco de Dados II Aula 1. Stored Procedures

Pacote de Idiomas do ImageNow Guia de Introdução

Guia de utilização da notação BPMN

Bem-vindo ao curso delta Gerenciamento de peso para a versão 9.1. Este curso aborda a nova solução de peso introduzida nessa versão.

8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito)

Neste artigo, serão apresentados os principais conceitos sobre os TRIGGERS e sua aplicabilidade.

RELATÓRIOS GERENCIAIS

Professor: Macêdo Firmino Disciplina: Sistemas Operacionais de Rede

Tarefa Orientada 19 Triggers

Neste tópico, abordaremos a funcionalidade de segurança fornecida com o SAP Business One.

,QWURGXomRDR(GLWRUGH $SUHVHQWDo}HV3RZHU3RLQW

LINX POSTOS AUTOSYSTEM

Banco de Dados II. Triggers e Functions. Prof. Moser Fagundes. Curso TSI Instituto Federal Sul-Rio-Grandense (IFSul) Campus Charqueadas

Integração de livros fiscais com o Microsoft Dynamics AX 2009

Técnicas de Normalização por Phaser

Tabelas vista de estrutura

Secretaria de Tecnologia da Informação Coordenadoria de Suporte Técnico aos Usuários

MANUAL INSTALAÇÃO WEB SERVICE

Banco de Dados. Microsoft Access. Índice

Laboratório de Banco de Dados Prof. Luiz Vivacqua. PL/pgSQL A Linguagem de programação do PostgreSQL

Capítulo 2. VARIÁVEIS DO TIPO INTEIRO

COMANDO DA AERONÁUTICA ESCOLA DE ESPECIALISTAS DE AERONÁUTICA SUBDIVISÃO DE ADMISSÃO E DE SELEÇÃO

ÍNDICE. Delphi... 3 CAPÍTULO 1 INTRODUÇÃO CAPÍTULO 2 INSTALANDO O DELPHI... 10

SQL. Curso Prático. Celso Henrique Poderoso de Oliveira. Novatec

SQL: Definição de tabelas, Modificações à Base de Dados

Projeto de Banco de Dados

Inserindo e Listando registros

Apostilas OBJETIVA Atendente Comercial / Carteiro / Op. Triagem e Transbordo CORREIOS - Concurso Público º CADERNO. Índice

Tópicos Avançados em Banco de Dados Gerenciamento de Transações em Banco de Dados. Prof. Hugo Souza

(1,n) venda. (1,1) realizacao. cliente. (0,n) (1,1) contem. produto. Laboratório de Banco de Dados Exercicios

Informática básica Telecentro/Infocentro Acessa-SP

SQL. Autor: Renata Viegas

1. Explicando Roteamento um exemplo prático. Através da análise de uns exemplos simples será possível compreender como o roteamento funciona.

Introdução à Engenharia da Computação. Banco de Dados Professor Machado

Banco de dados. Linguagens de Banco de Dados II. Wedson Quintanilha da Silva -


Primeiros passos das Planilhas de Obra v2.6

Prova de Fundamentos de Bancos de Dados 2 a Prova

ITIL v3 - Operação de Serviço - Parte 1

Analisando e comparando as funções do DBNavegator

Triggers e Regras. Fernando Lobo. Base de Dados, Universidade do Algarve

SQL Linguagem de Definição de Dados. Laboratório de Bases de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Transações Seguras em Bancos de Dados (MySQL)

Prof. Carlos Majer Aplicações Corporativas UNICID

SOP - TADS Sistemas de Arquivos Cap 4 Tanenmbaum

Fundamentos de Teste de Software

Manipulando Strings no VBA (Replace, Mid e InStr)

Índice: Nitgen do Brasil

Painel de Mensagens TXT TXT TXT Manual do Usuário

LINGUAGEM SQL. SQL Server 2008 Comandos iniciais

Introdução a Banco de Dados

Capítulo 2. Processos de Software Pearson Prentice Hall. Todos os direitos reservados. slide 1

EXERCÍCIOS PRÁTICOS. Banco de Dados

Gerenciamento da Integração (PMBoK 5ª ed.)

SISTEMA OPERACIONAL - MAC

PL/pgSQL por Diversão e Lucro

3.1 Definições Uma classe é a descrição de um tipo de objeto.

1. Domínio dos Atributos

Engenharia de Software e Gerência de Projetos Prof. Esp. André Luís Belini Bacharel em Sistemas de Informações MBA em Gestão Estratégica de Negócios

Neste tópico, você aprenderá a criar facilmente um banco de dados para uma nova empresa e a definir configurações comuns de uma empresa no SAP

Sistemas Operacionais. Curso Técnico Integrado Profa: Michelle Nery

Mantis. Solicitando suporte. Manual do Cliente

DALUA: BIBLIOTECA PARA APLICAÇÕES DISTRIBUÍDAS

agility made possible

Android e Bancos de Dados

COMO PROGRAMAR SEU TIME

GBD PROF. ANDREZA S. AREÃO

BANCO DE DADOS BANCO DE DADOS. Prof. Patrícia Lucas 3º Trimestre

Transcrição:

Replicação de Dados no Interbase Por Matt Hopkins, Dunstan Thomas(UK) LTD.Borland Developers Conferece 1998 - nessa época ainda não existia o componente IBReplicator Origem: http://www.ibphoenix.com/ibp_howto10.html Tradução : Marcilio Soares Revisão/adaptação do texto : Carlos Henrique Cantu - http://www.interbase-br.com Este documento descreverá a concepção básica para replicação de dados e como eles podem ser implementados de maneira relativamente simples usando semente recursos do próprio Interbase. O que é Replicação de Dados? É a cópia de informações de um ou mais Banco de dados para outro semelhante, depois das informações estarem consistentes. Há dois tipos básicos de replicação SÍNCRONA E SÍNCRONA Replicação Síncrona: Todas as cópias ou replicações de dados serão feitas no instante da sincronização e consistência. Se alguma cópia do banco é alterada, essa alteração será imediatamente aplicada a todos os outros bancos dentro da transação. A Replicação Síncrona é apropriada em aplicações comerciais onde a consistência exata das informações é de extrema importância. Replicação Assíncrona: Armazena e faz a replicação. A cópia de dados fica fora de sincronia entre os BDs. Se um BD é alterado, a alteração será propagada e aplicada para outro BD num segundo passo, dentro de uma transação separada sendo que esta poderá ocorrer segundos, minutos, horas ou até dias depois. A cópia poderá ficar temporariamente fora de sincronia, mas quando a sincronização ocorrer os dados convergirão para todos os locais especificados. Este documento trata exclusivamente sobre replicação de dados assíncrono. Quais componentes são necessários para a replicação de dados? Capturando as alterações no banco de dados de origem.

Toda estratégia de replicação de dados requer um método para capturar as alterações para um banco de dados de replicação. Há dois mecanismos principais Logs de Transação e Triggers. Logs de transação abordam a utilização de uma técnica chamada "log Sniffing" a qual replica uma transação sinalizada para replicação para um plataforma de transmissão. Esta técnica causa um impacto menor no servidor de Banco de Dados porque requer menor CPU quando da leitura de "Log" na memória e também na gravação para o disco. Este método de replicação é utilizado também por outros fabricantes de Bancos como Sybase, Informix e MS SQL/Server. A Segunda técnica usa triggers no Banco de dados para propagar as alterações quando elas ocorrem. Como a Linguagem procedural de Banco de dados pode ser utilizada nesse método, ela provê maior flexibilidade a medida que os dados são replicados. Esta implementação de replicação é utilizada pelo Ingres e Oracle, também será a técnica que nós utilizaremos ao trabalharmos com replicação com Interbase. Transmitindo alterações de um de Banco de Dados para o(s) Banco de dados Destino Para a transmição das alterações para o BD destino é requerido um Software que lê as alterações e as transmite ao BD Destino situado em algum lugar da rede e grava as alterações. Este Software é conhecido como um gerenciador de replicação e também controla erros e conflito de Updates. Como posso fazer Replicação de Dados com os componentes do Interbase? Registrando a alteração dos dados Para criar nosso processo de replicação nós precisaremos criar dois exemplos de Banco de Dados com tabelas idênticas em cada um dos Bancos. CREATE DATABE "source.gdb" PAGE_SIZE 1024 CREATE TABLE TEAMS ( TEAM_ID INTEGER NOT NULL, TEAM_NAME VARCHAR(100), TEAM_MGR VARCHAR(40), PRIMARY KEY (TEAM_ID)); CREATE TABLE CHANGES ( CHANGE_ID INTEGER NOT NULL, CHANGE_TYPE CHAR(1) NOT NULL, SOURCE_KEY_FIELD VARCHAR(31) NOT NULL, SOURCE_KEY INTEGER NOT NULL,

SOURCE_TABLE VARCHAR(31), USERNAME VARCHAR(31), PRIMARY KEY (CHANGE_ID)); CREATE GENERATOR NEW_TEAM_ID; CREATE GENERATOR NEW_CHANGE_ID; Agora criaremos um TRIGGER CHANGES na tabela para obtermos um único valor do GENERATOR CREATE TRIGGER CHANGES_NEWID FOR CHANGES BEFORE INSERT NEW.CHANGE_ID = GEN_ID(NEW_CHANGE_ID,1); END NOTA: Veja que não adicionaremos um trigger para gerar uma única ID na tabela TEAMS. Discutiremos este assunto na próxima sessão. Agora nós precisamos criar um mecanismo para registrar todas as alterações de nossa tabela. Como mencionado anteriormente, nós utilizaremos triggers para registrar as alterações para nossa tabela de Replicação. O benefício é que os triggers estão disponíveis, são fáceis de usar, e diferente dos logs de transação, eles possibilitam o uso de uma lógica de programação utilizando a linguagem procedural do Interbase. Há três tipos de alteração que poderão ocorrer na tabela Insert, Update e Delete. Nós precisaremos de três triggers para cada uma das tabelas replicadas. /* After an Insert */ CREATE TRIGGER TEAMS_REPL_INSERT FOR TEAMS AFTER INSERT INSERT INTO CHANGES (CHANGE_TYPE, SOURCE_KEY_FIELD, SOURCE_KEY, SOURCE_TABLE,USERNAME) VALUES ("I","TEAM_ID",NEW.TEAM_ID,"TEAMS",USER); END; /* After an Update */ CREATE TRIGGER TEAMS_REPL_UPDATE FOR TEAMS AFTER UPDATE

INSERT INTO CHANGES (CHANGE_TYPE, SOURCE_KEY_FIELD, SOURCE_KEY, SOURCE_TABLE,USERNAME) VALUES ("U","TEAM_ID",NEW.TEAM_ID,"TEAMS",USER); END; /* After a Delete */ CREATE TRIGGER TEAMS_REPL_DELETE FOR TEAMS AFTER DELETE INSERT INTO CHANGES (CHANGE_TYPE, SOURCE_KEY_FIELD, SOURCE_KEY, SOURCE_TABLE,USERNAME) VALUES ("D","TEAM_ID",OLD.TEAM_ID,"TEAMS",USER); END; Isto é tudo que se precisa para registrarmos as alterações de dados para uma replicação no Interbase. Note que para manter a simplicidade nós requisitamos que todas as tabelas replicadas tanha uma Chave Inteira (INTEGER KEY) única e que este é o único elemento de dados que será gravado na tabela CHANGES. Nós poderíamos armazenar todos os valores dos campos que foram alterados, mas como nós vamos replicar um snapshot dos dados armazenando apenas a chave e a ação, nós podemos recuperar os valores atuais em cada tabela pelo mecanismo de replicação. Mais um passo é necessário antes de irmos para o mecanismo de replicação. Nós precisaremos criar um Banco de Dados de destino com a mesma Metadata. Isto poderá ser feito fazendo um backup do BD e restaurando-o com o nome de "DESTINATION.GDB". Replicando os dados alterados Agora nós vamos criar um Servidor de Replicação usando Delphi. A idéia é permitir ao usuário pré-defina um tempo determinado para a replicação ou ele poderá manualmente solicitar a replicação com um botão "Replicar Agora". Um registro de todas as atividades será mostrada num Memo e algumas exceções que ocorram serão exibidas em um Memo de erros. O Banco Replicado e o Banco de Destino da Replicação serão passados em linha de comando através de parâmetros desta forma: C:\REPLD SOURCEDB TARGETDB Para nos assegurar de que o nosso projeto sempre terá dois parâmetros nós faremos assim:

if (ParamStr(1) = '') or (ParamStr(2) = '') then MessageDlg('Usage: "REPLD.EXE SOURCE_ALI TARGET_ALI"',mtError,[mbOK],0) else Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; Toda replicação será controlada por uma Procedure de replicação desta forma: procedure TForm1.Replicate; var qrychangelist : TQuery; strchangetype : String; qrychangelist := TQuery.create(Application); with qrychangelist do DatabaseName := 'SourceDB'; sql.add('select * from changes'); open; while not eof do if (fieldbyname('change_type').asstring = 'I') then strchangetype := 'Insert'; ReplicateInsert( fieldbyname('source_table').asstring,fieldbyname( 'SOURCE_KEY_FIELD').asString,fieldByName('SOURCE_KEY').asInteger) end else if (fieldbyname('change_type').asstring = 'U') then strchangetype := 'Update'; ReplicateUpdate( fieldbyname('source_table').asstring,fieldbyname( 'SOURCE_KEY_FIELD').asString,fieldByName('SOURCE_KEY').asInteger) end else if (fieldbyname('change_type').asstring = 'D') then strchangetype := 'Delete'; ReplicateDelete( fieldbyname('source_table').asstring,fieldbyname(

'SOURCE_KEY_FIELD').asString,fieldByName('SOURCE_KEY').asInteger) memolog.lines.add( DateTimeToStr(Now)+' '+strchangetype+ ' '+fieldbyname('source_key').asstring+ ' on '+fieldbyname('source_table').asstring); DeleteFromChanges(fieldByName('CHANGE_ID').asInteger); next; close; finally qrychangelist.free; E a cada ação(insert, DELETE, UPDATE) será chamada uma Procedure individual, como se segue: Replicate Inserts: procedure TForm1.ReplicateInsert( const strtablename, strkeyfield: String; const ikey: Integer); var qrysource, qrytarget : TQuery; i : SmallInt; qrysource := TQuery.create(Application); with qrysource do DatabaseName := 'SourceDB'; with sql do add('select * from '+strtablename); add(' where ('+strkeyfield+' = '+IntToStr(iKey)+');'); open; while not eof do qrytarget := TQuery.create(Application); with qrytarget do DatabaseName := 'TargetDB'; with sql do

add('insert into '+strtablename); add('('); for i := 0 to qrysource.fieldcount-1 do if (i < qrysource.fieldcount-1) then add(' '+qrysource.fields[i].fieldname+',') else add(' '+qrysource.fields[i].fieldname) add(')'); add('values'); add('('); for i := 0 to qrysource.fieldcount-1 do if (i < qrysource.fieldcount-1) then add(' :'+qrysource.fields[i].fieldname+',') else add(' :'+qrysource.fields[i].fieldname) add(')'); prepare; for i := 0 to qrysource.fieldcount-1 do qrytarget.params[i].asstring := qrysource.fields[i].asstring; execsql; finally qrytarget.free; next; close; except on e: Exception do memoerrors.lines.add(datetimetostr(now)+' '+e.message); finally qrysource.free; Replicate Upates: procedure TForm1.ReplicateUpdate( const strtablename, strkeyfield: String; const ikey: Integer);

var qrysource, qrytarget : TQuery; i : SmallInt; qrysource := TQuery.create(Application); with qrysource do DatabaseName := 'SourceDB'; with sql do add('select * from '+strtablename); add(' where ('+strkeyfield+' = '+IntToStr(iKey)+');'); open; while not eof do qrytarget := TQuery.create(Application); with qrytarget do DatabaseName := 'TargetDB'; with sql do add('update '+strtablename); add('set'); for i := 0 to qrysource.fieldcount-1 do if (i < qrysource.fieldcount-1) then add(' '+qrysource.fields[i].fieldname+ ' = :'+qrysource.fields[i].fieldname+',') else add(' '+qrysource.fields[i].fieldname+ ' = :'+qrysource.fields[i].fieldname) add(' where ('+strkeyfield+' = '+IntToStr(iKey)+');'); prepare; for i := 0 to qrysource.fieldcount-1 do qrytarget.params[i].asstring := qrysource.fields[i].asstring; execsql; finally qrytarget.free; next;

close; except on e: Exception do memoerrors.lines.add(datetimetostr(now)+' '+e.message); finally qrysource.free; Replicate Deletes: procedure TForm1.ReplicateDelete( const strtablename, strkeyfield: String; const ikey: Integer); var qrysource : TQuery; i : SmallInt; qrysource := TQuery.create(Application); with qrysource do DatabaseName := 'TargetDB'; sql.add('delete from '+strtablename); sql.add(' where ('+strkeyfield+' = '+IntToStr(iKey)+')'); execsql; execsql; except on e: Exception do memoerrors.lines.add(datetimetostr(now)+' '+e.message); finally qrysource.free; Nota: Este exemplo não suporta campos do tipo BLOB. Um código adicional será necessário para seu uso, mas isso é totalmente possível. Agora atribua o valor do SpinBox ao Timer. Desta forma você poderá ajustar o cliclo da replicação: procedure TForm1.SpinEdit1Change(Sender: TObject);

Timer1.Interval := (SpinEdit1.Value * 1000); Execute-o e enquanto REPLD estiver executando, faça alguma alteração na tabela TEAMS no Banco de dados Origem tendo certeza de adicionar uma chave única e verifique o banco de dados de destino (Depois de um ciclo de replicação) para ver as alterações replicadas. Replicação Bi-Direcional Cheque a tabela CHANGES no BD destino e voce verá que as alterações replicadas do BD origem também aparecerão nessa tabela. O problema é que o mecanismo utilizado para logar as alterações não está distinguindo as alterações feitas pelo usuário final das alterações feitas pelo mecanismo de replicação. Se nós iniciarmos uma replicação bi-direcional utilizando nosso aplicativo REPLD sem especificar um "usuário replicador", correremos o risco de entrar em um loop infinito. Portanto, nós precisaremos definir um "usuário replicador" para esse exemplo o chamaremos de "REPLICATE" em todos os servidores Interbase que estivermos usando, e não efetuaremos o log das alterações efetuadas por esse "usuário". Isso significa que precisaremos alterar os triggers para acada tabela replicada da seguinte forma : /* After an Insert */ ALTER TRIGGER TEAMS_REPL_INSERT FOR TEAMS AFTER INSERT IF (USER <> "REPLICATE") THEN INSERT INTO CHANGES (CHANGE_TYPE, SOURCE_KEY_FIELD, SOURCE_KEY, SOURCE_TABLE,USERNAME) VALUES ("I","TEAM_ID",NEW.TEAM_ID,"TEAMS",USER); END; /* After an Update */ ALTER TRIGGER TEAMS_REPL_UPDATE FOR TEAMS AFTER UPDATE IF (USER <> "REPLICATE") THEN INSERT INTO CHANGES (CHANGE_TYPE, SOURCE_KEY_FIELD, SOURCE_KEY, SOURCE_TABLE,USERNAME) VALUES ("U","TEAM_ID",NEW.TEAM_ID,"TEAMS",USER);

END; /* After a Delete */ ALTER TRIGGER TEAMS_REPL_DELETE FOR TEAMS AFTER DELETE IF (USER <> "REPLICATE") THEN INSERT INTO CHANGES (CHANGE_TYPE, SOURCE_KEY_FIELD, SOURCE_KEY, SOURCE_TABLE,USERNAME) VALUES ("D","TEAM_ID",OLD.TEAM_ID,"TEAMS",USER); END; Agora nós executaremos duas versões do REPLD: C:\REPLD SOURCEDB TARGETDB C:\REPLD TARGETDB SOURCEDB Voce deve notar que quando voce sai de um modelo de replicação mestre-escravo para um modelo ponto-a-ponto, diversas complexidades aparecem e devem ser consideradas antes de implementar a replicação. Essas complexidades e como trabalhar com elas serão discutidas na próxima seção. Replicando uma alteração quando ela ocorre (Near- Synchoronous Replication) Se desejarmos replicar as alterações de uma tabela sem depender do timer, nós precisamos utilizar o mecanismo de Eventos do Interbase. Ele requer a criação de dois passos: Gerar um evento e responder à um evento. Para gerar o evento, precisaremos adicionar um novo TRIGGER CHANGES na tabela TEAMS: CREATE TRIGGER CHANGES_ALERT FOR TEAMS AFTER INSERT POST_EVENT "NEW_CHANGE"; END; Para responder ao evento, precisaremos adicionar um componente do Delphi chamado IBEventAlerter em nossa aplicação REPLD, registrar nosso interesse no evento "NEW_CHANGE" adicionando-o à propriedade Events e então linkar o evento OnEventAlert à nossa procedure de replicação como se segue: procedure TForm1.IBEventAlerter1EventAlert(Sender: TObject;

EventName: string; EventCount: Longint; var CancelAlerts: Boolean); Replicate; Teste isso. Replicação em tabelas com chaves compostas Para simplicidade, no exemplo anterior nós replicamos tabelas simples com chaves inteiras. A mesma técnica, um pouco modificada, pode ser usada para replicar tabelas contendo chaves compostas. A principal diferença entre manusear chaves compostas e simples é no método que as alterações são logadas. Ao invés de uma simples tabela CHANGES, no caso de chaves compostas é necessário uma tabela de "log" para cada tabela base que será replicada. Replicação cruzada em WAN com R(Remote Access Services) O Serviço R do Windows NT e Dial-up Netwroking do Windows 9x permite acesso via modem aos serviços que só estariam disponíveis em uma rede. Isto significa que se precisássemos replicar informações em sites remotos através do nosso mecanismo de replicação, ele necessitará suportar o R. A maneira mais fácil de implementar no Delphi o R é usar componentes. Há vários disponíveis em forma de shareware ou freeware na internet. Para esse exemplo nós usaremos o TRas de Daniel Polistchuck que está disponível no site www.delphi32.com. Como toda a complexidade do R está sendo trabalhada pelo componente TR, para acrescentaro R à nossa replicação necessitará apenas algumas linhas de código. Primeiramente nós precisaremos modificar a procedure Replicate de forma que ocorrerá uma conexão via R sempre que uma alteração deverá ser replicada. procedure TForm1.Replicate; with qrychangelist do DatabaseName := 'SourceDB'; sql.add('select * from changes'); if active then close; open; if (recordcount > 0) then memolog.lines.add(datetimetostr(now)+' Dialing DT'); R1.EnName := 'DT'; R1.Connect;

Como você pode ver, nós adicionamos um teste para verificar se há registros à serem enviados e, caso seja verdadeiro é criada uma conexão R chamada "DT". Nos também movemos o resto do que previamente existia nesta procedure para o evento "OnConnect" do componente R e fizemos a query de alteração (QryChangeList) global para a form : procedure TForm1.R1Connect(Sender: TObject); var strchangetype : String; with qrychangelist do memolog.lines.add(datetimetostr(now)+' Connected to DT'); while not eof do if (fieldbyname('change_type').asstring = 'I') then strchangetype := 'Insert'; ReplicateInsert( fieldbyname('source_table').asstring,fieldbyname( 'SOURCE_KEY_FIELD').asString,fieldByName('SOURCE_KEY').asInteger) end else if (fieldbyname('change_type').asstring = 'U') then strchangetype := 'Update'; ReplicateUpdate( fieldbyname('source_table').asstring,fieldbyname( 'SOURCE_KEY_FIELD').asString,fieldByName('SOURCE_KEY').asInteger) end else if (fieldbyname('change_type').asstring = 'D') then strchangetype := 'Delete'; ReplicateDelete( fieldbyname('source_table').asstring,fieldbyname( 'SOURCE_KEY_FIELD').asString,fieldByName('SOURCE_KEY').asInteger)

memolog.lines.add( DateTimeToStr(Now)+' '+strchangetype+' '+ fieldbyname('source_key').asstring+ ' on '+fieldbyname('source_table').asstring); DeleteFromChanges(fieldByName('CHANGE_ID').asInteger); next; close; finally R1.Disconnect; memolog.lines.add(datetimetostr(now)+' Disconnected from DT'); Isto é tudo que se precisa para fazer uma conexão remota e replicar as alterações e fazer a desconexão. Isso é simples? Não. Com a replicação podem aparecer diversos problemas e por isso é necessário um bom design e planejamento prévio e às vezes um pouco de programação. Abaixo estão algumas orientações: Conflitos de Update A segurança para replicação Assíncrona é crítica para quase todas as aplicações. Porém, o que aconteceria se o mesmo elemento de dados (por exemplo, a mesma coluna de um mesmo registro) for atualizada em dois locais diferentes ao mesmo tempo, ou mais precisamente no mesmo intervalo de replicação? Isto é conhecido como conflito de Update. Sendo assim quanto menor for o tempo de atualização da réplica (ou seja, menor o intervalo(ciclo) de atualização) menor será a possibilidade de ocorrer conflitos de atualização. Alternativamente, os conflitos de atualizações podem ser evitados limitando o "ownership" ou o direito para atualizar um elemento de dado para um determinado local. Na realidade, muitos acreditam que resolução de conflito é uma questão de processamento e não uma questão para os desenvolvedores de software. Eliminando a possibilidade de conflitos através de design e procedimentos, o software não precisaria resolver conflitos de updates pois os mesmos nunca ocorreriam, na teoria. Essa visão no entanto é muito limitada quando os clientes estão exigindo que várias opções para resolução de conflitos sejam incorporadas nas ferramentas de replicação de dados. Unique Keys e Generators Tipicamente quando se trabalha com chaves únicas inteiras, uma trigger de BEFORE INSERT é utilizada adcionar e recuperar um novo valor de um generator. Quando se trabalha com replicação isso pode gerar alguns problemas.

O problema está em manter dois ou mais Banco de Dados sincronizados. Veja o exemplo abaixo: Em um BD, o generator contém o valor 5. Quando um novo registro é adicionado, a trigger incrementa o valor do generator em 1 e o valor para a chave do novo registro passa à ser 6. Este registro é replicado para um outro Banco de Dados. Nesse segundo BD, o valor do generator é de 100. Quando o registro replicado for inserido no segundo BD, uma trigger sobrepõe o valor da chave (6) com o próximo valor do generator (101). A solução tem duas possibilidades: A primeira é confiar que o Cliente irá dar um valor a chave e não usar trigger. A Segunda é dar intervalos de valores para cada BD, sendo que cada local possuirá certos valores de chave. Como no Interbase um valor do tipo Interger pode chegar a 2 bilhões de números, os intervalos de números poderiam ser divididos em partes de milhões se for necessário. O Generator para cada local poderá ser inicializado com um intervalo diferente usando para isso o comando para alterar o valor inicial do Generator: SET GENERATOR GEN_NAME TO 1000000; Inicialização Se você replicar uma origem de dados para um destino, então você precisará inicializar o destino pois ele estará fora de sincronia com a origem.. Tipicamente, você poderá fazer isto simplesmente implementando uma recarga dos dados da origem para o destino, ou seja do Banco de Dados para sua Replicação. Alterações na DDL O que acontece quando você muda o Metadata? Se você adicionar um campo em uma tabela de um lado, esta alteração terá de ser efetuada também nos outros BDs. Resumo Replicação de dados é um assunto importante nos dias de hoje e está sendo solicitado por um número cada vez maior de clientes em todo mundo. Na realidade, mais de cinquenta por cento do projetos iniciados desde dezembro de 1996 por mim (Dunstan Thomas) era requerido replicação. A Replicação tem o potencial para prover um melhor processamento, respostas mais rápidas, redução de comunicação, e evitar os gargalos de rede entre usuários geograficamente espalhados. Com o Interbase e o Microsoft R, a replicação de dados não é somente uma possibilidade mas sim uma realidade já disponível.