[firebase-br] Sincronização de bases de dados

Sandro Souza escovadordebits em gmail.com
Quinta Junho 18 09:28:41 -03 2020


Bom dia/tarde/noite meu nobre.

Cada PDV está acessando uma base de dados local ou todos estão acessando a
mesma base do servidor?

Veja o meu cenário e compare com o seu para verificar se algo pode ser
aproveitado.

Trabalho em uma holding (conjunto de empresas), e nesse caso, um grupo de
distribuidoras de medicamentos farmacêuticos, com uma unidade matriz e umas
10 unidades filiais atualmente.

Inicialmente, a base de dados, em Oracle, fica na matriz, e as filiais
apenas acessam o sistema via terminal service (área de trabalho remota) via
link dedicado.

O que fiz foi o seguinte: Vi as partes do sistema legado que mais são
utilizadas nas filiais, e criei uma base, em Firebird 2.5, contendo apenas
as tabelas que são utilizadas por essas primeiras partes.

Para sincronizar tudo, acrescentei uma coluna de alteração tanto nas
tabelas da base principal Oracle como nas mesmas tabelas na base em
Firebird.

Essa coluna que funciona como flag de alteração é do tipo TIMESTAMP e
opcional (não é NOT NULL), pois não adiantaria apenas marcar o registro
como "alterado ou não" (um CHAR(1) contendo S ou N, por exemplo), pois
enquanto um registro alterado fosse copiado de uma base para a outra, ele
poderia sofrer uma nova alteração, e sendo assim, ao terminar de copiar a
primeira versão do registro, e alterar o valor dessa coluna para N, eu
perderia as outras possíveis alterações.

Deixando essa coluna como TIMESTAMP, eu salvo o momento da inserção ou
alteração do registro.

Para garantir isso, e ficar de forma transparente para o sistema legado,
criei triggers/gatilhos para cada uma das tabelas a serem sincronizadas.

Essas triggers salvam o valor de CURRENT_TIMESTAMP nessa coluna de
"registro alterado".

Se a coluna está vazia (NULL) significa que o registro não precisa ser
sincronizado, então eu pesquiso apenas por registros onde essa coluna IS
NOT NULL.

Uma vez que o programa de sincronização de dados copia esse registro de uma
base para outra, ele faz um UPDATE naquele registro, passando os valores da
chave primária (é claro), mas também com a condição de que a coluna de
"registro alterado" tenha aquela data e hora lidos inicialmente, ou seja,
se essa coluna tinha o valor "2020-06-18 10-01-23.456", e durante a copia
do registro, o registro foi novamente alterado, significa que agora essa
mesma coluna já está com um outro valor de data e hora, e sendo assim,
quando executar o UPDATE TABELA_X SET REGISTRO_ALTERADO = NULL WHERE
(CHAVE_PRIMARIA = valor-da-chave-primária) AND (REGISTRO_ALTERADO =
'2020-06-18 10-01-23.456'), significa que só vai limpar (NULL) a coluna de
"registro alterado" se não houve qualquer nova alteração nesse registro
durante a cópia.

Se houve alguma alteração, o UPDATE não apagará o valor da coluna, por
conta dessa última condição, e dessa forma, eu não perco possíveis novas
alterações.

No meu caso, a sincronização é sempre no duplo sentido, ou seja, do Oracle
para o Firebird e vice versa.

Essa base em Firebird foi copiada para cada uma das filiais.

No meu caso, o código da filial está incluído nos registros que são
tratados individualmente nas próprias filiais (o sistema legado já nasceu
assim).

Por exemplo, o cadastro de produtos é único e global, todas as filiais
acessam, mas só a matriz pode incluir, alterar ou excluir. As filiais podem
apenas consultar.

No caso dos estoques dos produtos, são individuais por filial, então a
tabela de dados de produto por filial contém todas as informações do
produto que são referente àquela filial (saldo em estoque, preço de compra,
preço de venda, etc...).

Devido a essa arquitetura do sistema legado, não tive necessidade de criar
uma coluna separada de "registro alterado" para cada uma das filiais, já
que cada filial só alterará os registros referentes a ela mesma (com o
código da filial correspondente no próprio registro), então não há choque
de informações.

O programa de sincronização de dados que eu desenvolvi funciona dentro da
matriz, e conecta com cada uma das bases Firebirds de cada uma das filiais,
fazendo tudo acontecer de forma organizada, inclusive com tolerância a
quedas de conexão.

Como é a arquitetura que você utiliza?

Existe uma unidade matriz com uma base de dados própria?

Cada loja (filial) tem a sua base de dados própria que deve ser
sincronizada com a base da matriz?

Dentro de cada loja, os PDVs usam uma base local própria que deve ser
sincronizada com a base da loja?

Você poderia fornecer mais detalhes?

Espero ter mais ajudado que atrapalhado. :D


Em qua., 17 de jun. de 2020 às 21:49, Marcelo - MK Softwares <
marcelo em mksoftwares.com.br> escreveu:

> Pessoal boa noite
>
> Como fazer a sincronização de bases de dados. Cenário:
>
> - Um servidor sofrendo alterações diversas em seus registros, e um ou
> vários PDVs vendendo na loja, isso em rede local;
>
> - Um servidor sofrendo alterações diversas em seus registros, e as
> outras filiais vendendo.
>
> Até imagino que a cada registro alterado o mesmo poderia ter uma flag de
> alteração e os "clients" usariam essa flag para localizar os registros
> alterados e sincronizar. Mas no caso dos PDVs, onde pode ser um ou
> vários, uma flag não bastaria, teria que ter uma flag para cada pdv, e
> se tiver 30 pdvs na loja, terei 30 flags no banco.
>
> Hoje uso linguagem C# desenvolvendo aplicações desktop.
>
> Se alguém puder dar alguma sugestão agradeço.
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>


Mais detalhes sobre a lista de discussão lista