Ver Mensaje Individual
  #1  
Antiguo 01-06-2012
4PS_MultiPass 4PS_MultiPass is offline
Registrado
 
Registrado: may 2008
Posts: 5
Reputación: 0
4PS_MultiPass Va por buen camino
SQL Server 2005 Express y las transacciones anidadas

Hola a todos en el foro.

Si no es la primera vez que escribo, probablemente sea la segunda y es para pediros ayuda...

Tengo dos bases de datos creadas dentro de un servidor MS SQL server 2005 Express.

Tanto en la base de datos A como en la B existen las mismas tablas. La base de datos A es para los "dato de trabajo" y la base de datos B es para hacer las labores de "Histórico".

Lo que quiero implementar es el traspaso de información de la base de datos A a la base de datos B. Más específicamente, mover un registro de la base de datos A a la B.

Esto lo llevaría a cabo copiando el contenido de un registro de la tabla T1 de la base de datos A a la tabla T1 de la base de datos B y a continuación eliminando dicho registro de la tabla T1 de la base de datos A.

Además, para mí es muy importante hacerlo dentro de transacciones para asegurarme que si falla el copiado no ejecute el borrado, o que si falla el borrado que deshaga el copiado.

dbHistorico y dbDatos son dos TADOConnection

El trozo de código es el siguiente...
Código:
        cSentenciaHistorico := 'INSERT INTO T1 (campo)  values  ('valor');

        //Comienzo la primera transacción que controla la inserción del registro en el histórico.
        dbHistorico.BeginTrans;
        try
          dbHistorico.Execute(cSentenciaHistorico);
          // Comienza la segunda transaccion (anidada) que controla el borrado del registro en la base de datos "de diario".
          dbDatos.BeginTrans;
          try
            cSentenciaDatos := 'DELETE ' + cTabla + ' WHERE ' + cClave + ' = ' + TSQL.FieldByName( cClave ).AsString + ';';
            dbDatos.Execute(cSentenciaDatos);
            // si todo ha ido bien, hago un commit de las dos transacciones.
            dbDatos.CommitTrans;
            dbHistorico.CommitTrans;
          except
            // si falló el borrado, lo anulo.
            dbDatos.RollbackTrans;
            // reactivo la excepción para que también se deshaga la insercion.
            raise;
          end;
        except
          // si algo fué mal, que se deshaga el insert.. 
          dbHistorico.RollbackTrans;
        end;
Mi problema es que cuando el programa llega a la línea en donde se intenta abrir la segunda transacción, me salta una excepción con el siguiente mensaje "No se puede crear una nueva transacción, se excedió la capacidad".

No soy capaz de hayar una solución.

¿Vosotros veis si me estoy equivocando en algo?

¿Se os ocurre alguna otra forma de mover los registros de una db a otra de forma segura?

Perdonad por el tocho, pero es que no me sé explicar mejor.

Muchas gracias por adelantado.
Responder Con Cita