PDA

Ver la Versión Completa : Sentencias SQL con BLOBS


Franinho
08-11-2010, 12:01:48
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 Notevi
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 (http://www.intitec.com/varios/Como_trabajar_con_BLOBs.pdf) 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=ibphoenix&page=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
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
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