Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Bases de datos > PostgreSQL
Register FAQ Members List Calendar Guía de estilo Search Today's Posts Mark Forums Read

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 08/09/2014
JoAnCa's Avatar
JoAnCa JoAnCa is offline
Miembro
 
Join Date: Jul 2005
Location: Cuba
Posts: 438
Poder: 22
JoAnCa Va por buen camino
Cool Como sincronizar dos Bases de Datos (SQLite y PostgreSQL)

Hola a Todos
Tengo una aplicación que usa SQLite y necesito obtener los datos de otra aplicación que usa PostgreSQL, para la primera vez esta bien importar todos los datos de una para la otra, pero después solo necesito los datos nuevos, es decir soncronizar las 2 bases de datos

Los datos de las tablas que necesito, no siempre se modifican por eso necesito saber primero si se modificó alguna tabla o no, para en caso positivo obtener solo los datos nuevos o modificados de la BD Origen

Uso componentes los ZEOS para conectarme a ambos (SQLite y PostgreSQL) y Delphi7
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes
Reply With Quote
  #2  
Old 08/09/2014
Casimiro Noteví's Avatar
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Join Date: Sep 2004
Location: En algún lugar.
Posts: 32,682
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Lo más simple es poner un campo a las tablas que necesites sincronizar. Ese campo puede ser booleano o 1/0. Si es 1 es que hay que pasar el registro a la otra BD. Cuando se pase lo pones a cero.
Por ejemplo.
Reply With Quote
  #3  
Old 09/09/2014
Combat-F2D's Avatar
Combat-F2D Combat-F2D is offline
Miembro
 
Join Date: May 2003
Location: Toletum
Posts: 457
Poder: 24
Combat-F2D Va por buen camino
no te olvides de controlar las excepciones y posibles errores, es decir, dentro de transaciones
Reply With Quote
  #4  
Old 09/09/2014
pacopenin's Avatar
pacopenin pacopenin is offline
Miembro
 
Join Date: Sep 2010
Location: Asturias
Posts: 382
Poder: 16
pacopenin Va por buen camino
Si la sincronización es en una sola dirección opino como Casimiro. Otra cosa sería una sincronización bidireccional. Aún así, ojo con los registros borrados.
__________________
http://www.gestionportable.com
Reply With Quote
  #5  
Old 09/09/2014
Neftali [Germán.Estévez]'s Avatar
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Join Date: Jul 2004
Location: Barcelona - España
Posts: 19,449
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Quote:
Originally Posted by Casimiro Notevi View Post
Lo más simple es poner un campo a las tablas que necesites sincronizar. Ese campo puede ser booleano o 1/0. Si es 1 es que hay que pasar el registro a la otra BD. Cuando se pase lo pones a cero.
Por ejemplo.
Una variante a esto (la he utilizado) es utilizar un campo de TimeStamp en la Base de Datos origen y en la destino.
Eso te permite comparar los datos que ya has traspasado y evita los UPDATES en la BD origen en el momento de traspasar.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Reply With Quote
  #6  
Old 09/09/2014
JoAnCa's Avatar
JoAnCa JoAnCa is offline
Miembro
 
Join Date: Jul 2005
Location: Cuba
Posts: 438
Poder: 22
JoAnCa Va por buen camino
El problema es que no tengo control de la BD Origen (Postgres), pues es un soft de terceros, y en mi empresa quieren hacer un modulo que usa los datos de varias tablas de ese sistema, por eso en el sistema origen no puedo tocar nada, solo leer los registros que me interesan, y verificar si son iguales o no a los de mi BD (SQLite) para importar los nuevos o modificados
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes
Reply With Quote
  #7  
Old 09/09/2014
Casimiro Noteví's Avatar
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Join Date: Sep 2004
Location: En algún lugar.
Posts: 32,682
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Pues ya depende de lo que puedas leer.
Tienes que hacer como MacGyver ¿de qué dispones?, pues ahora a sacarle provecho a lo que tienes

Los registros que puedes leer tendrán un campo id único, se supone, pues aprovéchate de ellos para crear tú unas tablas con unos campos que te indiquen si ya lo has importado o no.
Reply With Quote
  #8  
Old 09/09/2014
Neftali [Germán.Estévez]'s Avatar
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Join Date: Jul 2004
Location: Barcelona - España
Posts: 19,449
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Quote:
Originally Posted by JoAnCa View Post
El problema es que no tengo control de la BD Origen (Postgres), pues es un soft de terceros, y en mi empresa quieren hacer un modulo que usa los datos de varias tablas de ese sistema, por eso en el sistema origen no puedo tocar nada, solo leer los registros que me interesan, y verificar si son iguales o no a los de mi BD (SQLite) para importar los nuevos o modificados
Pues entonces tendrás que copiar todos al sincronizar o realizar una comparación con todos los campos de cada registro para saber los que se han modificado y los que no. Esto último dependiendo de los registros totales de la tabla y de los modificados, te saldrá a cuenta o no.

Es decir, lo explico con un ejemplo.

Si la tabla son 200 registros y has modificado 100, te sale a cuenta no hacer la comparación y actualizarlos todos.
Si la tabla son 100.000 registros y has modificado 500, te sale a cuenta hacer la comparación.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Reply With Quote
  #9  
Old 10/09/2014
newtron's Avatar
[newtron] newtron is offline
Membrillo Premium
 
Join Date: Apr 2007
Location: Motril, Granada
Posts: 4,215
Poder: 24
newtron Va camino a la fama
Pues qué queréis que os diga pero yo veo una locura detectar en una tabla con unos cuantos miles de registros qué se ha modificado, borrado o insertado.

Igual te resultaría más "realista" poner límites a lo que quieres hacer y dedicarte por ejemplo a "importar" registros por fechas a la nueva base de datos pero claro, no sé lo que necesitas.. ¿sincronizar totalmente? ¿añadir registros nuevos? ¿también modificados? ¿anulados?..uffff....
__________________
Be water my friend.
Reply With Quote
  #10  
Old 10/09/2014
Neftali [Germán.Estévez]'s Avatar
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Join Date: Jul 2004
Location: Barcelona - España
Posts: 19,449
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Entiendo que no es un proceso que se haga "en vivo", es decir continuamente, sino cada x tiempo (estoy pensando 1 vez al día, 1 vez a la semana,...).
¿Es así?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Reply With Quote
  #11  
Old 10/09/2014
pacopenin's Avatar
pacopenin pacopenin is offline
Miembro
 
Join Date: Sep 2010
Location: Asturias
Posts: 382
Poder: 16
pacopenin Va por buen camino
Entiendo por lo que pones en el primer post que la primera vez se pasan todos los datos y luego solo los nuevos. Opciones que se me ocurren:
  • Si en la base de datos origen hay campos de fecha de creación, guarda en tu base de datos la fecha de la última actualización y añade sólo los posteriores a dicha fecha.
  • Si la base de datos origen tiene campos Id autoincrementados, utiliza esos mismos en la tuya y añade sólo a partir de el último id importado.
  • Sino? a pensar. Necesitaríamos más información.
Si no hay actualizaciones ni borrados debería bastar. En caso contrario, volveríamos al punto tercero.
__________________
http://www.gestionportable.com
Reply With Quote
  #12  
Old 12/09/2014
JoAnCa's Avatar
JoAnCa JoAnCa is offline
Miembro
 
Join Date: Jul 2005
Location: Cuba
Posts: 438
Poder: 22
JoAnCa Va por buen camino
Cool

Gracias a todos por las respuestas y disculpen la demora en responder, es que no habia tenido tiempo de conectarme

Pues le detallo el problema
En la BD origen necesito las tablas de trabajadores y vehiculos, generalmente son los mismos, pocas veces cambian

Pero puede darse el caso de una alta o baja de algun trabajador, en ese caso seria agregar el nuevo

En el caso de los vehículos, sucede lo mismo, pero además de adicionar, puede darse el caso de que un vehículo cambie la matrícula o el color, en ese caso seria actualizar el dato que cambió
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes
Reply With Quote
  #13  
Old 12/09/2014
roman's Avatar
roman roman is offline
Moderador
 
Join Date: May 2003
Location: Ciudad de México
Posts: 20,269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Entiendo que la base origen corresponde a un sistema que tú no manejas. Pero aunque no puedes alterar la estructura de las tablas quizá puedes agregar otras para tu propio uso así como algunos triggers. De ser así, podrías implementra disparadores after update, after insert y after delete en las tablas de interés, y con los datos del disparador, insertar registros en una tabla bitácora que te permitan determinar en qué tabla, y qué registros cambiaron.

// Saludos
Reply With Quote
  #14  
Old 12/09/2014
JoAnCa's Avatar
JoAnCa JoAnCa is offline
Miembro
 
Join Date: Jul 2005
Location: Cuba
Posts: 438
Poder: 22
JoAnCa Va por buen camino
Quote:
Originally Posted by roman View Post
Entiendo que la base origen corresponde a un sistema que tú no manejas. Pero aunque no puedes alterar la estructura de las tablas quizá puedes agregar otras para tu propio uso así como algunos triggers. De ser así, podrías implementra disparadores after update, after insert y after delete en las tablas de interés, y con los datos del disparador, insertar registros en una tabla bitácora que te permitan determinar en qué tabla, y qué registros cambiaron.
// Saludos
Revisaré para ver si puedo agregarle alguna tabla a la BD

Otra cosa, nunca he trabajado con los disparadores (triggers), con SQL solo he hecho tablas y vistas, casi siempre lo hago todo en la aplicacion, aunque me he dado cuenta que a veces es mejor "darle mas trabajo a la BD"

Podrias ponerme un ejemplo de como se implementa un triggers?

Por ejemplo, para la tabla vehiculos saber si el campo Matricula se modifico o si se agrego un vehiculo nuevo
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes
Reply With Quote
  #15  
Old 12/09/2014
roman's Avatar
roman roman is offline
Moderador
 
Join Date: May 2003
Location: Ciudad de México
Posts: 20,269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Yo no puedo darte un ejemplo porque sólo he programado triggers de prueba, nada de lo que me acuerde en estos momentos. Pero sí sé que PostgreSQL maneja triggers y buscando en Google o incluso aquí mismo, seguro que encontrarás algunos ejemplos. No recuerdo que fueran difíciles.

Incluso, recuerdo que alguien alguna vez aquí en el Club, hizo algo bastante bien elaborado precisamente para llevar un control de cambios.

Cosa de buscar. Si encuentro algo, lo enlazo.

// Saludos
Reply With Quote
  #16  
Old 12/09/2014
JoAnCa's Avatar
JoAnCa JoAnCa is offline
Miembro
 
Join Date: Jul 2005
Location: Cuba
Posts: 438
Poder: 22
JoAnCa Va por buen camino
Ya estuve consultando a Google y me mostro como es, es verdad es bastante sencillo, lo que pasa es que nunca habia usado triggers

Hay que crear el trigger y asociarlo a la tabla que quiero controlar el cambio, pero no se si el postgres me dara los permisos para hacerlo
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Como sincronizar datos entre bases datos cliente a servidor (asincronicamente) Efren2006 OOP 6 29/03/2013 11:36
Administradores de bases de datos SQLite rretamar Conexión con bases de datos 10 22/01/2011 00:00
Administración de bases de datos SQLITE rretamar Conexión con bases de datos 1 29/12/2009 18:00
Sincronizar 2 Bases de Datos Interbase Efren2006 SQL 1 09/02/2009 15:30
Sincronizar bases de datos SMTZ Oracle 4 30/11/2006 01:47


All times are GMT +2. The time now is 23:08.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi