Abfangen von Fehlern im Trigger

07/09/2007 - 16:53 von Steffen Rzonsa | Report spam
Hallo NG,

ein Trigger soll eine Aktion ausführen (im Beispiel "PRINT 1 / 0"; im konkreten Anwendungsfall eine SQL-Anweisung, um Daten in eine andere Datenbank zu schreiben).
Normalerweise wird der Trigger abgebrochen, wenn die Aktion einen Fehler auslöst. Das is OK.

Im konkreten Anwendungsfall soll der Trigger jedoch NICHT abgebrochen werden, wenn die Aktion einen Fehler auslöst.
Stattdessen möchte ich dann eine andere Aktion ausführen (im Beispiel "PRINT 'catch'").

Meine Versuche mit TRY ... CATCH waren leider nicht erfolgreich, da die Ausführung des Triggers mit folgender Fehlermeldung beendet wurde:
Meldung 3616, Ebene 16, Status 1, Zeile 1
Die Transaktion ist bei der Triggerausführung fehlgeschlagen. Der Batch wurde abgebrochen.

Was kann ich tun, damit der Trigger trotz Fehlschlagen der Aktion im TRY-Block ohne Fehler ausgeführt wird?

Tschüss Steffen



ALTER TRIGGER [dbo].[TRI_MyTable_Upd]
ON [dbo].[MyTable]
AFTER UPDATE
AS
IF @@ROWCOUNT > 0
BEGIN
BEGIN TRY
PRINT 1 / 0
END TRY
BEGIN CATCH
PRINT 'catch'
END CATCH
END
 

Lesen sie die antworten

#1 Elmar Boye
08/09/2007 - 11:14 | Warnen spam
Hallo Steffen,

Steffen Rzonsa schrieb ...
ein Trigger soll eine Aktion ausführen (im Beispiel "PRINT 1 / 0"; im
konkreten Anwendungsfall eine SQL-Anweisung, um Daten in eine andere
Datenbank zu schreiben).
Normalerweise wird der Trigger abgebrochen, wenn die Aktion einen Fehler
auslöst. Das is OK.

Im konkreten Anwendungsfall soll der Trigger jedoch NICHT abgebrochen
werden, wenn die Aktion einen Fehler auslöst.
Stattdessen möchte ich dann eine andere Aktion ausführen (im Beispiel
"PRINT 'catch'").



Aufgrund der Transaktionsabwicklung ist das innerhalb des Triggers
nur eingeschrànkt möglich, da eine Transaktion in dem Falle bereits
ungültig (doomed) ist - dazu siehe auch XACT_STATE().
Wobei anzumerken wàre, dass bei bei einer impliziten Transaktion dort
zwar 0 geliefert, wird aber ebenso wie bei einer expliziten Transaktion
als abgebrochen gilt.

Was kann ich tun, damit der Trigger trotz Fehlschlagen der Aktion im
TRY-Block ohne Fehler ausgeführt wird?



Im Endeffekt muss Du BEGIN TRY im àusseren Block durchführen,
in etwa:

BEGIN TRAN
GO
BEGIN TRY
UPDATE dbo.MyTable SET Daten = 'def' WHERE id = 4711
END TRY
BEGIN CATCH
IF XACT_STATE() = -1 ROLLBACK
END CATCH;
GO
IF @@TRANCOUNT > 0 COMMIT

Wenn Du oben nur die UPDATE Anweisung ausführst, wird XACT_STATE()
als 0 geliefert.

Am besten sind Konstrukte mit BEGIN TRY in einer Prozedur aufgehoben,
und evtl. solltest Du dort auch die Trigger Anweisungen ausführen.

Gruss
Elmar

Ähnliche fragen