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

Edison Júnior edison.bortolin em kms.com.br
Ter Out 17 12:15:37 -03 2006


Porque não utilizar o IBReplicator?

[ ] 's

Edison Júnior

Desenvolvimento escreveu:
> 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
>
>
>   


-- 
Edison Júnior
KM Tecnologia
http://www.kms.com.br
+55 19 3252 2429





Mais detalhes sobre a lista de discussão lista