2016-07-14 6 views
0

Verwendung von SQL Server 2014 Handhabung:TSQL: TRY CATCH Fehler mit Protokollieren von Fehlern in eine Tabelle

ich durch den folgenden Artikel werde, die nützliche Muster für TSQL Fehlerbehandlung beinhaltet:

https://msdn.microsoft.com/en-IN/library/ms175976.aspx

I Ich mag es, Fehler so zu protokollieren, dass ich die Fehler in den Speicherprozeduren meiner Anwendung abfragen, überwachen, verfolgen und überprüfen kann.

Ich dachte daran, eine Tabelle zu erstellen und die Fehlerdetails als Zeile in die Tabelle im CATCH-Block einzufügen; Ich bin jedoch besorgt, dass dies möglicherweise kein gutes Muster ist. ODER es könnte eine eingebaute SQL-Server-Funktion geben, die die von der Anweisung THROW erzeugten Fehler protokollieren kann.

Was wäre der beste Weg, um die Fehler zu protokollieren?

Update 1

Ich sollte erwähnen, dass ich immer XACT_ABORT auf meinem SPs gesetzt:

SET XACT_ABORT, NOCOUNT ON

Ist es sicher davon ausgehen, dass es keine Möglichkeit, Fehler protokollieren, wenn XACT_ABORT eingeschaltet ist?

Update 2

Der SET XACT_ABORT ON wird nach diesem Beitrag:

http://www.sommarskog.se/error_handling/Part1.html#jumpXACT_ABORT

Kann xp_logevent eine bessere Alternative als ein Fehlerprotokoll in eine Log-Tabelle hinzufügen?

Antwort

0

Sie müssen sehr vorsichtig mit der Protokollierung von CATCH-Sperren sein. In erster Linie müssen Sie überprüfen Sie die XACT_STATE() und ehren Sie es. Wenn xact_state -1 ( 'nicht commitable transaction') ist, können Sie keine Transaktionsoperation ausführen, daher schlägt INSERT fehl. Sie müssen zuerst Rollback und dann einfügen. Sie können jedoch nicht einfach einen Rollback ausführen, da Sie möglicherweise in xact_state 0 (keine Transaktion) sind. In diesem Fall würde Rollback fehlschlagen. Und wenn xact_state 1 ist, befinden Sie sich immer noch in der ursprünglichen Transaktion, und Ihr INSERT kann immer noch zurückgesetzt werden später und Sie werden alle Spuren dieses Fehlers jemals auftreten.

Ein anderer zu berücksichtigender Ansatz besteht darin, ein benutzerdefiniertes Profilereignis unter Verwendung von sp_trace_generateevent zu generieren und über eine Systemablaufverfolgung zu verfügen, die Ihre Benutzerereignis-ID überwacht. Dies funktioniert in jedem xact_state-Zustand und hat den Vorteil, dass der Datensatz auch dann beibehalten wird, wenn die umgreifende Transaktion später zurückgesetzt wird.

sollte ich erwähnen, dass ich immer gesetzt XACT_ABORT

Stopp dies zu tun. Lesen Sie Exception handling and nested transactions für ein gutes SP-Muster gegenüber Fehlerbehandlung und Transaktionen.

+0

http://www.sommarskog.se/error_handling/Part1 .html # jumpXACT_ABORT –

+0

Die XACT_ABORT-Idee kam von diesem Beitrag: http://www.sommarskog.se/error_handling/Part1.html#jumpXACT_ABORT. Das Problem mit sp_trace_generateevent ist, dass es immer einen Profiler-Listener benötigt. Es zeichnet den Fehler nicht auf. Können wir stattdessen xp_logevent verwenden? –

+0

Ich habe viel Respekt für Erland, aber in der Frage von XACT_ABORT stimme ich ihm nicht zu. –

0

Ja, es ist besser. Wenn Sie speichern möchten, dann versuchen Sie dies.

declare @Error_msg_desc varchar(500) 
,@Error_err_code int    
,@Error_sev_num int   
,@Error_proc_nm varchar(100)  
,@Error_line_num int  
begin try 
    select 1/0 
end try 
begin catch 
    select @Error_err_code = ERROR_NUMBER()   
      ,@Error_msg_desc = ERROR_MESSAGE()  
      ,@Error_sev_num = ERROR_SEVERITY()   
      ,@Error_proc_nm = ERROR_PROCEDURE()   
      ,@Error_line_num = ERROR_LINE() 
    --create SqlLog Table  
    --Insert into Log Table 
    Insert into Sqllog values(@Error_err_code,@Error_msg_desc,@Error_sev_num,@Error_proc_nm,@Error_line_num)    
end catch 
+0

Würde dies mit SET XACT_ABORT, NOCOUNT ON funktionieren? –

+0

Es wird die gesamte Transaktion zurückgesetzt und abgebrochen, aber nicht in der Lage Protokollfehler. –

+0

Ist also davon auszugehen, dass mit SET XACT_ABORT ON keine Fehlerprotokollierung möglich ist? –