Re: [firebase-br] Experiência com replicação

Francisco francisco em logosinfo.com.br
Ter Out 17 11:31:50 -03 2006


william, muito bom. eu estou com um cliente para implementar algo parecido.
fiquei com uma duvida do seguinte: numa tabela de clientes vc usa como chave 
primaria o codigo+empresa?
digamos q na matriz o codigo do cliente esta em 1000 e na filial cadastraram 
um cliente com o codigo 999, que na matriz ja foi cadastrado. como é o seiu 
procedimento?

obrigado...
----- Original Message ----- 
From: "Desenvolvimento" <desenvolvimento em passofeliz.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Tuesday, October 17, 2006 11:01 AM
Subject: [firebase-br] Experiência com replicação


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





______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa



-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.408 / Virus Database: 268.13.4/476 - Release Date: 14/10/2006







Mais detalhes sobre a lista de discussão lista