Escribir en una tabla de log luego de un ROLLBACK TRAN

10/05/2006 - 16:50 por Alejandro Giardino | Informe spam
Hola a todos, quisiera poder escribir en una talba luego de la una
sentencia ROLLBACK TRAN en caso de producirse un error en una transacción.
Mando un codigo minimo de ejemplo:

BEGIN TRAN MiTransaccion
declare @err int
insert into tabla1 (valor_1, valor_2 , ... , valor_n)
set @err = @@error

IF @err <> 0
BEGIN
ROLLBACK TRAN MiTransaccion
insert into tabla2 (valor_1, valor_2 , ... , valor_n)
END

commit TRAN MiTransaccion



El problema que tengo es que si hay un error y se ejecuta el "ROLLBACK TRAN"
MiTransaccion, no se ejecuta el "insert into tabla2 (valor_1, valor_2 , ...
, valor_n)"
Tal vez la solución pasa por encararlo desde otro lado pero no se me ocurre
como.

Gracias a todos

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
10/05/2006 - 17:25 | Informe spam
Alejandro,

Posiblemente el error cause que el batch completo sea abortado sin que se
haya ejecutado "rollback transaction" y por eso no pasa por la sentencia
"insert". Tambien puede ser posible que la sentencia "commit transaction" te
este dando error porque hicistes un rollback pero no veo que uses "return"
despues de insertar en "tabla2", lo que implicaria que esta no tenga una
sentencia "begin transaction" que asociada.

Implementing Error Handling with Stored Procedures
http://www.sommarskog.se/error-handling-II.html

Error Handling in SQL Server – a Background
http://www.sommarskog.se/error-handling-I.html


AMB

"Alejandro Giardino" wrote:

Hola a todos, quisiera poder escribir en una talba luego de la una
sentencia ROLLBACK TRAN en caso de producirse un error en una transacción.
Mando un codigo minimo de ejemplo:

BEGIN TRAN MiTransaccion
declare @err int
insert into tabla1 (valor_1, valor_2 , ... , valor_n)
set @err = @@error

IF @err <> 0
BEGIN
ROLLBACK TRAN MiTransaccion
insert into tabla2 (valor_1, valor_2 , ... , valor_n)
END

commit TRAN MiTransaccion



El problema que tengo es que si hay un error y se ejecuta el "ROLLBACK TRAN"
MiTransaccion, no se ejecuta el "insert into tabla2 (valor_1, valor_2 , ...
, valor_n)"
Tal vez la solución pasa por encararlo desde otro lado pero no se me ocurre
como.

Gracias a todos



Respuesta Responder a este mensaje
#2 Alejandro Giardino
10/05/2006 - 17:42 | Informe spam
Hola Alejandro te respondo con un ejemplo más concreto:

-
BEGIN TRAN MiTransaccion
declare @err int
insert into clientes (nombre, apellido, edad) values
('Alejandro','Giardino', 'L')
set @err = @@error

IF @err <> 0
BEGIN
ROLLBACK TRAN MiTransaccion
insert into clientes (nombre, apellido, edad) values ( 'Ocurrio' ,
'Error', @err)
RETURN
END

commit TRAN MiTransaccion


El campo edad es numérico y al pasarle el dato 'L' falla (que es lo que
quiero porque estoy generando el error deliberadamente para probar el
rollback). Según entiendo un problema de tipo de datos debería ejecutar el
rollback, pero... bueno... justamente con eso estoy trabado.

Gracias
Alejandro

"Alejandro Mesa" escribió en el
mensaje news:
Alejandro,

Posiblemente el error cause que el batch completo sea abortado sin que se
haya ejecutado "rollback transaction" y por eso no pasa por la sentencia
"insert". Tambien puede ser posible que la sentencia "commit transaction"
te
este dando error porque hicistes un rollback pero no veo que uses "return"
despues de insertar en "tabla2", lo que implicaria que esta no tenga una
sentencia "begin transaction" que asociada.

Implementing Error Handling with Stored Procedures
http://www.sommarskog.se/error-handling-II.html

Error Handling in SQL Server - a Background
http://www.sommarskog.se/error-handling-I.html


AMB

"Alejandro Giardino" wrote:

Hola a todos, quisiera poder escribir en una talba luego de la una
sentencia ROLLBACK TRAN en caso de producirse un error en una
transacción.
Mando un codigo minimo de ejemplo:

BEGIN TRAN MiTransaccion
declare @err int
insert into tabla1 (valor_1, valor_2 , ... , valor_n)
set @err = @@error

IF @err <> 0
BEGIN
ROLLBACK TRAN MiTransaccion
insert into tabla2 (valor_1, valor_2 , ... , valor_n)
END

commit TRAN MiTransaccion



El problema que tengo es que si hay un error y se ejecuta el "ROLLBACK
TRAN"
MiTransaccion, no se ejecuta el "insert into tabla2 (valor_1, valor_2 ,
...
, valor_n)"
Tal vez la solución pasa por encararlo desde otro lado pero no se me
ocurre
como.

Gracias a todos



Respuesta Responder a este mensaje
#3 Alejandro Mesa
11/05/2006 - 14:05 | Informe spam
Alejandro,

El manejo de errores en SQL Server 2000 no es muy fuerte que digamos. Hay
errores, como este caso, que abortan el batch donde este ocurre, incluyendo
el batch padre desde donde este fue llamado (puede ser mas de un nivel). Este
tipo de errores es solo atrapable desde la aplicacion cliente.

Si vas a insertar valores, como en este caso, usa un procedimiento que
espero ciertos parametros e inserta los parametros. El tipo de data de los
parametros te ayudara en la validacion.

Si quieres ahondar un poco mas sobre el tratamiento de errores en SQL Server
2000, te recomiendo leer los articulos que atache en el primer posting.


AMB


"Alejandro Giardino" wrote:

Hola Alejandro te respondo con un ejemplo más concreto:

-
BEGIN TRAN MiTransaccion
declare @err int
insert into clientes (nombre, apellido, edad) values
('Alejandro','Giardino', 'L')
set @err = @@error

IF @err <> 0
BEGIN
ROLLBACK TRAN MiTransaccion
insert into clientes (nombre, apellido, edad) values ( 'Ocurrio' ,
'Error', @err)
RETURN
END

commit TRAN MiTransaccion


El campo edad es numérico y al pasarle el dato 'L' falla (que es lo que
quiero porque estoy generando el error deliberadamente para probar el
rollback). Según entiendo un problema de tipo de datos debería ejecutar el
rollback, pero... bueno... justamente con eso estoy trabado.

Gracias
Alejandro

"Alejandro Mesa" escribió en el
mensaje news:
> Alejandro,
>
> Posiblemente el error cause que el batch completo sea abortado sin que se
> haya ejecutado "rollback transaction" y por eso no pasa por la sentencia
> "insert". Tambien puede ser posible que la sentencia "commit transaction"
> te
> este dando error porque hicistes un rollback pero no veo que uses "return"
> despues de insertar en "tabla2", lo que implicaria que esta no tenga una
> sentencia "begin transaction" que asociada.
>
> Implementing Error Handling with Stored Procedures
> http://www.sommarskog.se/error-handling-II.html
>
> Error Handling in SQL Server - a Background
> http://www.sommarskog.se/error-handling-I.html
>
>
> AMB
>
> "Alejandro Giardino" wrote:
>
>> Hola a todos, quisiera poder escribir en una talba luego de la una
>> sentencia ROLLBACK TRAN en caso de producirse un error en una
>> transacción.
>> Mando un codigo minimo de ejemplo:
>>
>> BEGIN TRAN MiTransaccion
>> declare @err int
>> insert into tabla1 (valor_1, valor_2 , ... , valor_n)
>> set @err = @@error
>>
>> IF @err <> 0
>> BEGIN
>> ROLLBACK TRAN MiTransaccion
>> insert into tabla2 (valor_1, valor_2 , ... , valor_n)
>> END
>>
>> commit TRAN MiTransaccion
>>
>>
>>
>> El problema que tengo es que si hay un error y se ejecuta el "ROLLBACK
>> TRAN"
>> MiTransaccion, no se ejecuta el "insert into tabla2 (valor_1, valor_2 ,
>> ...
>> , valor_n)"
>> Tal vez la solución pasa por encararlo desde otro lado pero no se me
>> ocurre
>> como.
>>
>> Gracias a todos
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida