Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Sentencias SQL con BLOBS (https://www.clubdelphi.com/foros/showthread.php?t=70728)

Franinho 08-11-2010 12:01:48

Sentencias SQL con BLOBS
 
Buenos días,

Haber si alguien me puede echar una mano. Os comento:

Tengo varias bases de datos. Todas ellas deben estar sincronizadas. Para ello controlo todos los eventos (insert, update, delete) que se hacen sobre la base de datos MASTER y guardo estas sentencias en una tabla auxiliar.

Luego ejecuto todas estas sentencias en las otras bases de datos y estas quedan totalmente sincronizadas.

Pero tengo el problema, de que si la tabla sobre la que controlo los eventos, contiene blobs, no se como generar las distintas sentencias.

He echo un export into file, para ver como lo hace la máquina para exportar una tabla con blobs y luego hacer el insert. Genera una variable de memoria (creo..) que contiene la imagen. Pero no tengo ni idea de como la genera...

Alguien me puede echar una mano?

Un cordial saludo :)

Casimiro Noteví 08-11-2010 12:46:50

Supongo que sería igual que con el resto de campos salvo que tendrás que guardar el fichero que tienes en el blob (imagen, pdf, video, etc.) para luego cargarlo y guardarlo en la BD destino.
Con estos campos puedes hacer un .savetofile y .loadfromfile para ayudarte en el proceso.
Puedes hacer una búsqueda por clubdelphi, son cosas que se han tratado en diversas ocasiones.
Por si acaso te sirve de algo, aquí tienes un documento pdf explicando la forma de trabajar con campos blob.
Si tienes alguna duda, ya sabes... aquí estamos.

Neftali [Germán.Estévez] 08-11-2010 13:26:22

¿Desde dónde haces ese control de Insert/delete/update?
¿Desde la Base de Datos o desde programa?

Si es desde B.D., tal vez deberías crear una tabla temporal para guardar los Blobs mientras replicas las sentencias en las otras B.D.

Franinho 08-11-2010 13:32:02

Lo controlo desde la BD con un trigger.

Buena aportación, me has dado una idea!

Voy a probar!

guillotmarc 08-11-2010 13:38:57

Esta difícil lo que quieres hacer. A menos que sean campos BLOB de texto, no puedes escribir una sentencia SQL que modifique su contenido (para los campos BLOB de texto no hay que hacer nada especial, se pueden tratar como un campo de texto cualquiera).

Hay adaptaciones en los Scripts de Firebird que permiten crear sentencias SQL que modifiquen campos BLOB, pero son extensiones propias de programas como IBExpert, y no son estándar (solo funcionan dentro de IBExpert, on con su IBEScript.exe). Además sueles tener que guardar el campo BLOB en un archivo independiente, por lo que dificilmente lo podrás integrar en tu mecanismo actual, ni en tus tablas de modificaciones.

Normalmente este problema se solventa con la Replicación de datos, en ella se guarda en una tabla auxiliar la clave ID de los registros a sincronizar (y no las sentencias SQL que se han usado), y en el momento de sincronizar los datos, se lee la información y se copia a la otra base de datos.

Este es el documento "clásico" para la replicación entre bases de datos Interbase/Firebird (verás como probablemente con tu mecanismo ya tienes medio trabajo hecho).

http://www.ibphoenix.com/main.nfs?a=...ge=ibp_howto10

No hace mucho hablamos del tema en el Foro, creo que te seria útil leerte este hilo.

http://www.clubdelphi.com/foros/showthread.php?t=69827

Saludos.

Neftali [Germán.Estévez] 08-11-2010 13:47:18

Cita:

Empezado por Franinho (Mensaje 381662)
Lo controlo desde la BD con un trigger.

Eso me había parecido, pero no estaba seguro.
Al hacer el INSERT se trataría de guardar la sentencia SQl (eso ya lo haces) y guardar el BLOB en una tabla de BLOBs con una referencia a esa sentencia.
Después al replicar en las otras Bases de Datos, podrías hacerlo en 2 pasos:
(1) Ejecutar la sentencia.
(2) Actualizar el BLOB.

Si hay algun BLOB que es obligatorio (NOT NULL) deberás "inventarte" algun truco para poder hacer la inserción (que ahora mismo no tengo claro cual... :o).

Franinho 08-11-2010 17:56:59

Cita:

Eso me había parecido, pero no estaba seguro.
Al hacer el INSERT se trataría de guardar la sentencia SQl (eso ya lo haces) y guardar el BLOB en una tabla de BLOBs con una referencia a esa sentencia.
Después al replicar en las otras Bases de Datos, podrías hacerlo en 2 pasos:
(1) Ejecutar la sentencia.
(2) Actualizar el BLOB.

Si hay algun BLOB que es obligatorio (NOT NULL) deberás "inventarte" algun truco para poder hacer la inserción (que ahora mismo no tengo claro cual... :o).
Ya había pensado en hacer esto...de echo me parece la solución más sencilla...pero a mi jefe le va la marcha...e intentaré buscar otra solución mas compleja y elegante.

De momento...sigo perdido de como hacerlo :S


La franja horaria es GMT +2. Ahora son las 23:34:21.

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