Muchas gracias compañeros, sin vuestra ayuda me hubiese quedado atascado demasiado tiempo intentando resolver este tema.
Bueno, pues finalmente me he decidido por el siguiente grupo de instrucciones. Espero que no parezca muy chapucero, pero después de algunas pruebas, esto me encaja para lo que quiero llevar a cabo, es decir, funciona, no sé si será la mejor opción, pero al menos me funciona.
Finalmente no he recurrido ni a un procedimiento almacenado ni a transacciones anidadas pero encajará (creo
).
Tomando el ejemplo de mightydragonlor, he visto la sintaxis para referenciar tablas de distintas bases de datos, es decir [base de datos 1].dbo.tabla1
Con ese dato lo que voy a hacer es componer una transacción que implique cambios en las dos bases de datos y... o todo va bien, o no se hace nada.
Nota: cSentencia es una variable de tipo WideString, dbDatos es un TADOConnection y zComillaSimple es una función que agrega una comilla simple ' al principio y al final de la cadena de caracteres que se le pasa como parámetro.
Código:
...
// preparo la transacción que implica dos bases de datos.
cSentencia :=
' INSERT INTO [HISTORIC].[dbo].[ARTICULO] (cCodigoArt,cDescriArt) ' +
' SELECT cCodigoArt,cDescriArt ' +
' FROM [DATA].dbo.ARTICULO ' +
' WHERE cCodigoArt = ' + zComillaSimple('009999') + ';';
cSentencia := cSentencia +
' DELETE FROM [DATA].dbo.ARTICULO'+
' WHERE cCodigoArt = ' + zComillaSimple('009999') + ';'
// Inicio la transacción.
dbDatos.BeginTrans;
try
frmPrincipal.dbDatos.Execute(cSentencia);
dbDatos.CommitTrans;
// si se hace el cut & paste de manera correcta, saldrá por aquí.
showMessage('todo correcto');
except
dbDatos.RollbackTrans;
// si algo va mal, se deshacen los cambios y saldrá por aquí.
showMessage('Oh, oh. Algo ha ido mal.');
end;
Este trozo de código traspasa el artículo con código 009999 de la tabla ARTICULO de la base de datos DATA a la tabla ARTICULO de la base de datos HISTORIC, es decir una especie de Cut and paste.
Vuelvo a insistir en agradecer vuestra ayuda, sois fabulosos.