Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Aufzeichnen der SQL Server-Aufrufliste beim Melden von Fehlern

Ok, ich füge unsere Fehlerbehandlung wieder hinzu :-)

Die ERROR_%()-Funktionen sind für den Geltungsbereich des CATCH-Blocks sichtbar. Das bedeutet, dass Sie sie in jedem CATCH-Block in einer gespeicherten Prozedur oder einem Funktionsaufruf verwenden können

Und bei verschachtelten gespeicherten Prozessen ist es hilfreich zu wissen, was den Fehler verursacht hat und was den Fehler protokolliert

...
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    EXEC dbo.MyExceptionHandler @@PROCID, @errmsg OUTPUT;
    RAISERROR (@errmsg, 16, 1);
END CATCH

---with this handler (cut down version of ours)
CREATE PROCEDURE dbo.MyExceptionHandler
    @CallerProcID int,
    @ErrorMessage varchar(2000) OUTPUT
WITH EXECUTE AS OWNER --may be needed to get around metadata visibility issues of OBJECT_NAME
AS
SET NOCOUNT, XACT_ABORT ON;

BEGIN TRY
    SET @ErrorMessage = --cutdown
            CASE
                WHEN @errproc = @callerproc THEN        --Caller = error generator
                        --build up stuff

                ELSE    --Just append stuff             --Nested error stack
            END;

    IF @@TRANCOUNT = 0
        INSERT dbo.Exception (Who, TheError, WhatBy, LoggedBy)
        VALUES (ORIGINAL_LOGIN()), RTRIM(ERROR_MESSAGE()), ERROR_PROCEDURE(), OBJECT_NAME(@CallerProcID));
END TRY
BEGIN CATCH
   --and do what exactly?
END CATCH
GO

Das ist sowieso die Grundidee:Jeder CATCH-Block ist einfach, die Arbeit geht im Fehlerbehandler weiter. Hängen Sie zB ERROR_NUMBER() an wenn Sie möchten