En un principio todo puede hacerse con otra base de datos de intercambio. Con más claridad: paso aquellas filas que deben ser modificadas en la tabla destino a una base de datos de intercambio y (apagando el servicio) copio la base de datos de intercambio para llevarla a destino y realizar la operación opuesta.
La base de datos de intercambio, puede ser un archivo binario creado con ClientDataSet en vez de una tabla firebird para evitar tener que apagar el servicio para evitar corromper la base de datos. Y en este segundo caso aun es más complicado, debido a su distinta naturaleza. Por lo que me remito al primer caso.
Ahora bien, el problema que me surgió y hasta ahora creo que es una limitación de Firebird, es el siguiente:
Para pasar de una tabla a otra que no se encuentre en el mismo archivo no hallo la manera de expresar la sentencia, debido principalmente a que una consulta con TIBQuery se encuentra en el marco de una sola base de datos y una única transacción (esto último es obvio).
La única forma que hallé hasta el momento es copiar mediante fuerza bruta (apareo), es decir recorriendo las filas de la tabla origen y creando o modificando filas de la tabla destino, hasta terminar las filas de la tabla origen.
O sea, quitando todo lo complicado:
delphi
TablaOrigen.First while not TablaOrigen.Eof do begin TablaDestino.Insert TablaDestino.Campo1:= TablaOrigen.Campo1 TablaDestino. ... TablaDestino.Campon:= TablaOrigen.Campon TablaDestino.Post TablaOrigen.Next end Commit
Utilizo los componentes de Interbase
¿Alguien conoce alguna conexión o algún método para hacer este trabajo de una manera más eficiente?
¿O simplemente no puedo salir del marco de la base de datos?
Vi soluciones con extracción de datos usando herramientas externas (isql), pero no es a lo que me refiero, sino a un método desde la aplicación sin recurrir a llamadas a programas externos.