none
Enviar email desde CATCH END CATCH RRS feed

  • Pregunta

  • Hola a todos

    Tengo una SPs y dentro de ella trato de hacer tratamiento de errores de la siguiente forma

    CREATE PROCEDURE SP_CON_ERROR
    AS
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
    DECLARE @error varchar(200) = ''
    BEGIN TRY 
    BEGIN TRAN

    -- aqui varios updates

    COMMIT TRAN

    END TRY 

    BEGIN CATCH

    SET @error =  N'Línea  -->' +CAST(ERROR_LINE() AS varchar(20) ) + N'   ' + N'Procedimiento  -->' + ERROR_PROCEDURE() 
    EXEC msdb.dbo.sp_send_dbmail  
        @profile_name = N'JOBS ERRORS',  
        @recipients = 'juanperez@correo.com',  
    @copy_recipients = N'pepe@correo.com',
        @body = @error,  
        @subject = 'Error en SP_CON_ERROR' ;

    END CATCH

    a su vez esta SP la ejecuto desde JOB_1 con dos Steps: 

    1: PASO_1 

    EXEC SP1
    EXEC SP2
    EXEC SP_CON_ERROR 

    en Advanced tengo que si falla vaya al segundo paso


    2: ENVIA_EMAIL

    EXEC msdb.dbo.sp_send_dbmail  
    EXEC msdb.dbo.sp_send_dbmail  
    @profile_name = N'JOBS ERRORS',  
    @recipients = 'juanperez@correo.com',  
    @copy_recipients = N'pepe@correo.com',
    @body = N'SP_CON_ERROR ha fallado',  
    @subject = 'Error en SP_CON_ERROR' ;

    el problema es que la ejecución del Step 2 funciona bien, me envía el correo cuando falla Step 1, pero el envío en el CATCH no se ejecuta, y es importante saber que linea de SP_CON_ERROR da error. Debo deciros que el error es de interbloqueo:

    "Msg 1205, Sev 13, State 52, Line 23 : La transacción (id. de proceso 67) quedó en interbloqueo en bloqueo | búfer de comunicaciones recursos con otro proceso y fue elegida como sujeto del interbloqueo. Ejecute de nuevo la transacción. [SQLSTATE 40001]
    Job 'JOB_1' : Step 1, 'PASO_1' : Began Executing 2017-03-24 14:59:50"

    Muchas gracias de antemano.

    Saludos








    viernes, 24 de marzo de 2017 15:30

Respuestas

  • Sospecho que puede ser que el sp_send_dbmail tenga un problema por estarlo ejecutando dentro de la misma transacción que cuando falla se mete en el Catch. Prueba a ponerle lo primero un ROLLBACK dentro del catch antes de llamar al sp_send_dbmail.

    Si con esto no se resuelve, ejecuta una traza del Profiler marcándole la casilla para que capture el diagrama de interbloqueos (deadlock). Provoca el error, y después examina el diagrama capturado, a ver qué se está interbloqueando con qué otra cosa. Eso debería dar una pista que conduzca a solucionar el problema.

    viernes, 24 de marzo de 2017 18:57

Todas las respuestas

  • Sospecho que puede ser que el sp_send_dbmail tenga un problema por estarlo ejecutando dentro de la misma transacción que cuando falla se mete en el Catch. Prueba a ponerle lo primero un ROLLBACK dentro del catch antes de llamar al sp_send_dbmail.

    Si con esto no se resuelve, ejecuta una traza del Profiler marcándole la casilla para que capture el diagrama de interbloqueos (deadlock). Provoca el error, y después examina el diagrama capturado, a ver qué se está interbloqueando con qué otra cosa. Eso debería dar una pista que conduzca a solucionar el problema.

    viernes, 24 de marzo de 2017 18:57
  • Sospecho que puede ser que el sp_send_dbmail tenga un problema por estarlo ejecutando dentro de la misma transacción que cuando falla se mete en el Catch. Prueba a ponerle lo primero un ROLLBACK dentro del catch antes de llamar al sp_send_dbmail.

    Si con esto no se resuelve, ejecuta una traza del Profiler marcándole la casilla para que capture el diagrama de interbloqueos (deadlock). Provoca el error, y después examina el diagrama capturado, a ver qué se está interbloqueando con qué otra cosa. Eso debería dar una pista que conduzca a solucionar el problema.

    Gracias Alberto, he modificado el SP como propones, hasta ahora no ha vuelto a fallar, espero no tener que "probar " el código modificado, igual y en modo "no producción" fuerzo el error, pero eso será otro día. Saludos a todos.


    lunes, 27 de marzo de 2017 11:28