¿Cómo mantener un registro de log después de hacer rollback?

03/05/2006 - 13:50 por Santiago Sanz | Informe spam
¡Hola!

Tengo esta transacción:

BEGIN TRANSACTION

INSERT INTO logs (message) VALUES ('SQL insertará un nuevo registro')


INSERT INTO productos (id, name) VALUES (1, 'libro')

IF @@ERROR <> 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION


pero quiero mantener el apunte de log incluso si se ejecuta el "rollback".
¿Sabéis cómo puedo hacer eso?

¡Muchas gracias!

Santi

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
03/05/2006 - 14:01 | Informe spam
Santiago,

Saca la sentencia que inserta en la tabla "logs" fuera de la transaccion
explicita.

INSERT INTO logs (message) VALUES ('SQL insertará un nuevo registro')

BEGIN TRANSACTION

INSERT INTO productos (id, name) VALUES (1, 'libro')

IF @@ERROR <> 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

Para una unica sentencia, no hace falta una transaccion explicita. Esta
sentencia se ejecuta sobre una transaccion y si esta falla, SQL Server hara
el rollback automaticamente.


AMB

"Santiago Sanz" wrote:

¡Hola!

Tengo esta transacción:

BEGIN TRANSACTION

INSERT INTO logs (message) VALUES ('SQL insertará un nuevo registro')


INSERT INTO productos (id, name) VALUES (1, 'libro')

IF @@ERROR <> 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION


pero quiero mantener el apunte de log incluso si se ejecuta el "rollback".
¿Sabéis cómo puedo hacer eso?

¡Muchas gracias!

Santi
Respuesta Responder a este mensaje
#2 Santiago Sanz
03/05/2006 - 15:53 | Informe spam
Hola Alejandro,

Gracias por tu respuesta. El problema es que mi caso no es tan sencillo como
el ejemplo que he puesto.

Me explico: tengo un DTS transaccional con muchos pasos (algunos de ellos
son tareas de transformación de datos de Oracle a SQL y otros ejecutan
sentecias T-SQL como truncates, selects o incluso storeds complejos). A lo
largo del DTS inserto muchos (entre 20 y 30) apuntes de log que me ayudan a
hacer un seguimiento de qué se está ejecutando en cada momento. El problema
es que cuando se produce un error el rollback del DTS hace desaparecer todos
los apuntes de log y me resulta bastante difícil saber exactamente dónde ha
fallado el proceso, por lo que es muy importante para mí mantener dichos logs.

¿Se te ocurre alguna idea?

Gracias

Santi

"Alejandro Mesa" escribió:

Santiago,

Saca la sentencia que inserta en la tabla "logs" fuera de la transaccion
explicita.

INSERT INTO logs (message) VALUES ('SQL insertará un nuevo registro')

BEGIN TRANSACTION

INSERT INTO productos (id, name) VALUES (1, 'libro')

IF @@ERROR <> 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

Para una unica sentencia, no hace falta una transaccion explicita. Esta
sentencia se ejecuta sobre una transaccion y si esta falla, SQL Server hara
el rollback automaticamente.


AMB

"Santiago Sanz" wrote:

> ¡Hola!
>
> Tengo esta transacción:
>
> BEGIN TRANSACTION
>
> INSERT INTO logs (message) VALUES ('SQL insertará un nuevo registro')
>
>
> INSERT INTO productos (id, name) VALUES (1, 'libro')
>
> IF @@ERROR <> 0
> ROLLBACK TRANSACTION
> ELSE
> COMMIT TRANSACTION
>
>
> pero quiero mantener el apunte de log incluso si se ejecuta el "rollback".
> ¿Sabéis cómo puedo hacer eso?
>
> ¡Muchas gracias!
>
> Santi
Respuesta Responder a este mensaje
#3 Alejandro Mesa
03/05/2006 - 19:39 | Informe spam
Santiago,

Tendrias que separar las tareas y poner la sentencia "insert" hacia la tabla
log en una tarea independiente, la cual no se integre a la transaccion.
Puedes manejar que la tarea se integre o no a la transaccion si das
click-derecho sobre la tarea, escojes "Workflow" - "Workflow properties" y
vas la pestaña "Options". En la caja correspondiente a "Transaction", el
primer checkbox "Join Transaction if present", si lo desmarcas entonces la
escritura hacia la tabla logs no formara parte de la transaccion. El resto de
las tareas si deben unirse y ademas marcar el checkbox "Rollback transaction
on failure".


AMB

"Santiago Sanz" wrote:

Hola Alejandro,

Gracias por tu respuesta. El problema es que mi caso no es tan sencillo como
el ejemplo que he puesto.

Me explico: tengo un DTS transaccional con muchos pasos (algunos de ellos
son tareas de transformación de datos de Oracle a SQL y otros ejecutan
sentecias T-SQL como truncates, selects o incluso storeds complejos). A lo
largo del DTS inserto muchos (entre 20 y 30) apuntes de log que me ayudan a
hacer un seguimiento de qué se está ejecutando en cada momento. El problema
es que cuando se produce un error el rollback del DTS hace desaparecer todos
los apuntes de log y me resulta bastante difícil saber exactamente dónde ha
fallado el proceso, por lo que es muy importante para mí mantener dichos logs.

¿Se te ocurre alguna idea?

Gracias

Santi

"Alejandro Mesa" escribió:

> Santiago,
>
> Saca la sentencia que inserta en la tabla "logs" fuera de la transaccion
> explicita.
>
> INSERT INTO logs (message) VALUES ('SQL insertará un nuevo registro')
>
> BEGIN TRANSACTION
>
> INSERT INTO productos (id, name) VALUES (1, 'libro')
>
> IF @@ERROR <> 0
> ROLLBACK TRANSACTION
> ELSE
> COMMIT TRANSACTION
>
> Para una unica sentencia, no hace falta una transaccion explicita. Esta
> sentencia se ejecuta sobre una transaccion y si esta falla, SQL Server hara
> el rollback automaticamente.
>
>
> AMB
>
> "Santiago Sanz" wrote:
>
> > ¡Hola!
> >
> > Tengo esta transacción:
> >
> > BEGIN TRANSACTION
> >
> > INSERT INTO logs (message) VALUES ('SQL insertará un nuevo registro')
> >
> >
> > INSERT INTO productos (id, name) VALUES (1, 'libro')
> >
> > IF @@ERROR <> 0
> > ROLLBACK TRANSACTION
> > ELSE
> > COMMIT TRANSACTION
> >
> >
> > pero quiero mantener el apunte de log incluso si se ejecuta el "rollback".
> > ¿Sabéis cómo puedo hacer eso?
> >
> > ¡Muchas gracias!
> >
> > Santi
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida