Triggerfehler: Die aktuelle Transaktion kann nicht festgeschrieben werden und kann keine Operationen unterstützen, die in die Protokolldatei schreiben

8

Ich erhalte die folgende Fehlermeldung von SQL Server, wenn sp_SomeProc versucht, eine ungültige SQL-Anweisung auszuführen. Ich bekomme den Fehler:

%Vor%

Irgendwelche Ideen, was ich falsch mache? (Dies ist nur ein Beispiel, das ich erstellt habe, um das Problem zu imitieren, also bitte nicht "Warum machst du das?", "das hat Auswirkungen auf die Sicherheit", etc ..)

So sieht mein Tisch aus:

%Vor%

Also in meinem Auslöser habe ich:

%Vor%

Nun sieht der Code von sp_SomeProc wie folgt aus:

%Vor%

Zum Testen versuche ich:

%Vor%     
Denis 12.04.2013, 20:29
quelle

1 Antwort

38

Dieser Fehler tritt auf, wenn Sie einen try / catch-Block innerhalb einer Transaktion verwenden. Betrachten wir ein triviales Beispiel:

%Vor%

Wenn die vierte Einfügung einen Fehler verursacht, wird der Stapel beendet und die Transaktion wird zurückgesetzt. Keine Überraschungen bisher.

Versuchen wir nun, diesen Fehler mit einem TRY / CATCH-Block zu behandeln:

%Vor%

Wir haben den doppelten Schlüsselfehler erkannt, aber ansonsten sind wir nicht besser dran. Unser Batch wird noch beendet, und unsere Transaktion wird immer noch zurückgesetzt. Der Grund ist eigentlich sehr einfach:

TRY / CATCH-Blöcke haben keine Auswirkungen auf Transaktionen.

Da XACT_ABORT ON ist, ist die Transaktion in dem Moment, in dem der doppelte Schlüsselfehler auftritt, zum Scheitern verurteilt. Es ist getan für. Es wurde tödlich verwundet. Es wurde durch das Herz geschossen ... und der Fehler ist schuld. TRY / CATCH gibt SQL Server ... einen schlechten Namen. (Entschuldigung, konnte nicht widerstehen)

Mit anderen Worten, es wird NIE festgeschrieben und IMMER zurückgesetzt. Alles, was ein TRY / CATCH-Block tun kann, ist den Fall der Leiche zu brechen. Wir können die Funktion XACT_STATE () verwenden, um festzustellen, ob unsere Transaktion übertragbar ist. Wenn dies nicht der Fall ist, besteht die einzige Möglichkeit darin, die Transaktion rückgängig zu machen.

%Vor%

Trigger werden immer im Kontext einer Transaktion ausgeführt. Wenn Sie also vermeiden können, TRY / CATCH in ihnen zu verwenden, sind die Dinge viel einfacher.

Zur Lösung Ihres Problems konnte CLR Stored Proc in einer separaten Verbindung eine Verbindung zum SQL Server herstellen, um das dynamische SQL auszuführen. Sie erhalten die Möglichkeit, den Code in einer neuen Transaktion auszuführen, und die Fehlerbehandlungslogik ist in C # sowohl einfach zu schreiben als auch leicht zu verstehen.

    
StrayCatDBA 13.04.2013, 06:13
quelle