[firebase-br] Experiência com replicação
Desenvolvimento
desenvolvimento em passofeliz.com.br
Ter Out 17 11:01:57 -03 2006
Vou compartilhar a minha experiência com replicação:
No BD tenho 2 usuários : SYSDBA e o REPLICATE
No Servidor:
Cada registro gravado gera através de triggers 1 registro por Loja de
replicação, ou seja, se houverem 3 lojas p/ replicar serão 1x3 registros.
Criei uma Tabela q é responsável pelo controle de registros a serem
replicados essa tabela armazena qual a tabela q replicou e a chave primaria
CREATE TABLE REPLICA (
ID_REPL INTEGER NOT NULL, //Número sequencial incrementando via
Generator/Trigger
LOJA SMALLINT NOT NULL, //Loja q deve receber o registro
TIPO CHAR(1), // (I)nsert , (D)elete ou (U)pdate Cada tabela tem 3 triggers
Before Insert, Update, Delete
CAMPO1 INTEGER, //Esses 3 campos são as chaves primarias das tabelas
CAMPO2 INTEGER, //Dependendo da tabela pode conter chaves compostas
CAMPO3 INTEGER,
COD_TAB SMALLINT, // Armazena qual a tabela q gerou a replicação
ULT_MODIFI TIMESTAMP, PRIMARY KEY(ID_REPL));
Criei uma numeração para controle de cada tabela
1=Cidade
2=Bairro
3=Clientes
4...
Ex de Trigger de Insert
CREATE TRIGGER "TR_REPL_BAIRRO_I" FOR "BAIRRO"
ACTIVE BEFORE INSERT POSITION 5
AS
begin
/* Como a replicação funciona nos 2 sentidos eu testo se o registro é
referente a uma sincronização ou não */
IF (USER <> 'REPLICATE') THEN
BEGIN
DELETE FROM REPLICA WHERE COD_TAB = 2 AND campo1 = NEW.COD_BAIRRO;
INSERT INTO REPLICA VALUES (0, 1, 'I', NEW.COD_BAIRRO, NULL, null, 2,
NEW.ULT_MODIFI);
INSERT INTO REPLICA VALUES (0, 2, 'I', NEW.COD_BAIRRO, NULL, null, 2,
NEW.ULT_MODIFI);
INSERT INTO REPLICA VALUES (0, 3, 'I', NEW.COD_BAIRRO, NULL, null, 2,
NEW.ULT_MODIFI);
END
end
No sistema de replicação eu crio 2 procedures, sendo q o sistema só roda nas
lojas replicadas e em apenas 1 maq por loja:
===============================================================================
Receber;
Consulta no servidor o proximo registro a ser recebido:
SELECT FIRST 1 * FROM REPLICA WHERE LOJA = ' + inttostr(CodLoja) + ' ORDER
BY ID_REPL';
Case CdsServidor.FieldByName('cod_tab').asinteger of
1:begin
...
end;
2:begin //Bairro
if CdsServidor.fieldbyname('tipo').asstring <> 'D' then //Se não for
exclusão
Testa se o registro ja existe, se ja existir compara os 2 e se
necessário faz o update local
else
Exclui o registro local
end;
3:begin
...
end;
End;
Exclui o registro da tabela Replica do servidor
DELETE FROM REPLICA WHERE ID_REPL = ' +
CdsServidor.fieldbyname('id_repl').asstring;
=========================================================================
Na tabela Replica das Lojas as triggers de replicação : Insert, Update,
Delete só geram 1 X 1 por registro
O processo de Enviar a replicação para o Servidor Centralizador é o inverso
do processo de Receber;
=========================================================================
No sistema de replicação a conexão local é feita com o user REPLICATE e a
conexão com o servidor é feita com o user SYSDBA para não entrar num loop de
replicação.
Tentei resumir , pois isso é um assunto muito extenso...
Desculpem o tamanho do email...
William C. Brazilino
Mais detalhes sobre a lista de discussão lista