[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