Re: Wie beendet man einen Trigger vorzeitig?

Tech-Archive recommends: Speed Up your PC by fixing your registry





"Elmar Boye" wrote:


Hallo Christoph,

Christoph Ingenhaag schrieb:
>
ein rollback im Trigger kann aber zu sehr viel Ungemach führen.
Der Aufrufer, der den Trigger ausgelöst hat, wird sich dann ggf. über
Msg 3903, Level 16, State 1, Line 1
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.

Das passiert bei Triggern normalerweise nicht, da ein Trigger IMMER in
einer Transaktion stattfindet, einzig sollte man Uwes Beispielcode
noch durch eine @@TRANCOUNT Abfrage absichern, s. u.

Hallo Elmar,

das passiert dann, wenn bsplw. über eine Anwendung eine Transaktion geöffnet
wird. Wenn innerhalb dieser Transaktion in einem Trigger ein Rollback
erfolgt, weiss die Anwendung nichts davon.
Besonders ärgerlich wäre so ein Rollback in dem Fall, wenn vorher ein save
tran durchgeführt worden wäre. Das wär dann für die Katz...
Verantwortlich für ein Rollback oder Commit muss immer der Aufrufer sein,
oder das DBMS selbst (bei entsprechend schweren Fehlern), den nur hier ist
die Kompetenz vorhanden, die Konsequenzen der Beendigung der Transaktion im
Gesamtkontext genau dieser Transaktion beurteilen zu können.


IF Bedingung
BEGIN
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
RETURN
END

Mit Fehlermeldung...

IF Bedingung
BEGIN
RAISERROR ('Du hast was falsch gemacht', 11, 1)

IF @@TRANCOUNT > 0 ROLLBACK

RETURN
END


Da eine Triggerausführung wie du richtig erwähnst immer in einer Transaktion
stattfindet, und zwar genau in der Transaktion, die den Trigger ausgelöst
hat, wird Trancount immer grösser 0 sein.


wobei man immer einen Fehler (besser ab Stufe 16) melden sollte, da
ansonsten der Anwender rätselt, warum seine Daten nicht gespeichert
wurden.

Nich nur der Anwender, sondern ggf. andere Projektteammitglieder die an
anderen Schichten beschäftig sind, die sich dann fragen, was die Datenbank
da so treibt, oder die Qualitätssicherung.


siehe auch: http://www.sommarskog.se/error-handling-II.html

Gruß
Elmar

Also meine Empfehlung: Kein Rollback in Triggern, sondern Fehlermeldung.

Vg
Christoph
.



Relevant Pages

  • Re: SQLServer 2000 und Transaktionen
    ... Habe BEGIN TRANSACTION mit SQLSETPROP ersetzt und auf ... ROLLBACK durch SQLROLLBACK. ... dass du hier eine VFP Transaktion ... >Remote Views laufen aber über ODBC, ...
    (microsoft.public.de.fox)
  • Re: Trigger mit Rollback Transaktion (SQL Server 2005)
    ... Leider bekomme ich immer einen Fehler sobald der Befehl "Rollback ... Transaction" im Trigger verwendet wird. ... Die Transaktion endete mit dem Trigger. ... Der Batch wurde abgebrochen. ...
    (microsoft.public.de.sqlserver)
  • Re: Wie beendet man einen Trigger vorzeitig?
    ... Der Aufrufer, der den Trigger ausgelöst hat, wird sich dann ggf. ... Wenn innerhalb dieser Transaktion in einem Trigger ein Rollback erfolgt, ... oder das DBMS selbst, den nur hier ist die Kompetenz vorhanden, die Konsequenzen der Beendigung der Transaktion im Gesamtkontext genau dieser Transaktion beurteilen zu können. ...
    (microsoft.public.de.sqlserver)
  • Re: E-Mail aus Trigger schicken
    ... Trigger laufen innerhalb der Transaktion. ... Deine Transaktion ein Rollback. ... Datenbank-E-Mail soll statt dessen verwendet werden. ...
    (microsoft.public.de.sqlserver)
  • Rollback wird nicht beendet
    ... einer offenen Transaktion. ... Irgendwo unter "blockiert von" müsste Deine ... >ich habe gestern einen Vorgang auf einer Tabelle ... >Dieses Rollback nimmt kein Ende. ...
    (microsoft.public.de.sqlserver)