[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