2014/07/12

TRY .. CATCH, COMMIT... ROLLBACK Y EL MANEJO DE ERRORES.

Hola de nueva cuenta, mucho se preguntan si es possible el control de errores dentro de SQL SERVER, la respuesta es sí, através de las instrucciones TRY CATCH y en conjunto con COMMIT y ROLLBACK son una excelente manera para detectar errores y evitar algún comportamiento no deseado en nuestro código, les explicaré un poco más:
TRY CATCH 
Se utiliza para el manejo de errores detectados dentro de un bloque.
COMMIT
Es la finalización de nuestro bloque de código y todas las instrucciones dentro de él se llevarán a cabo siempre y cuando no se haya generado error alguno.
ROLLBACK
Sirve para deshacer todos los movimientos realizados dentro del bloque de la transacción del mismo nombre.

Ahora les mostraré un ejemplo, primero creamos una tabla:
IF OBJECT_ID( 'tblPruebas' ) IS NOT NULL
       DROP TABLE tblPruebas


CREATE TABLE tblPruebas ( cve INT )

Ahora ejecutamos una serie de instrucciones con los bloques de código TRY, CATCH y COMMIT.
INSERT INTO tblPruebas VALUES( 1 )

BEGIN TRY
       INSERT INTO tblPruebas VALUES( 2 ) , ( 3 ) --b
       BEGIN TRAN nombreTransaccion
             INSERT INTO tblPruebas VALUES( 4 ) --c
             INSERT INTO tblPruebas VALUES( 5 ) , ( 'a' ) --d
       COMMIT TRAN nombreTransaccion
END TRY
BEGIN CATCH 
       SELECT ERROR_NUMBER() AS errNumber
       , ERROR_SEVERITY() AS errSeverity  
       , ERROR_STATE() AS errState
       , ERROR_PROCEDURE() AS errProcedure
       , ERROR_LINE() AS errLine
       , ERROR_MESSAGE() AS errMessage

       ROLLBACK TRAN nombreTransaccion

       SELECT * FROM tblPruebas

END CATCH
Como podemos observar, el INSERT (a) está fuera de ambos bloques, por lo tanto se ejecuta con normalidad, el (b) se encuentra dentro del bloque TRY pero fuera del bloque BEGIN TRAN… COMMIT TRAN,  (c) y (d) se encuentran dentro de ambos bloques, solo que esté ultimo genera un error, entonces capturamos el error y se obtiene con las funciones de ERROR que solamente se pueden utilizar dentro del bloque CATCH y aplicamos un ROLLBACK TRAN, por lo tanto todo el bloque de instrucciones dentro de la transacción del mismo nombre, se revierten, es por ellos que el valor 4 no se inserta a la tabla.

Espero que les sirva de ayuda, cualquier duda o comentario, pueden escribirme.

SALUDOS!
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE

0 comentarios:

Publicar un comentario