Discussion:
Fehler abfangen
(zu alt für eine Antwort)
Charlie
2005-09-13 08:18:03 UTC
Permalink
Hallo,

wie kann ich am besten Fehler in Trigger und Prozeduren abfangen?

Es gibt einen Prozess, der bei uns über eine lange Strecke mehrere Trigger
und Prozedeuren auf versch. Tabellen ausführt.
Zum Schluß muss dann gecheckt werden ob irgendwo ein Fehler aufgetreten ist,
oder nicht.

Man kann diesen ganzen Vorgang anhand einer ID in den Tabellen nachvollziehen.

Wichtig wäre mir mal, wie ich am besten ev. SQL-Fehler abfangen kann.

lg
Charlie
Frank Kalis
2005-09-13 08:32:03 UTC
Permalink
Post by Charlie
wie kann ich am besten Fehler in Trigger und Prozeduren abfangen?
Schau mal ob das hilft:
http://www.sommarskog.se/error-handling-II.html
http://www.sommarskog.se/error-handling-I.html
--
Frank Kalis
Microsoft SQL Server MVP
http://www.insidesql.de
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
Charlie
2005-09-13 08:55:03 UTC
Permalink
Hi,

danke, aber ich check es nicht ganz.
Ich benutze MSSQL 2000 und will eine funktion wie in Yukon:
also try und catch.

Wie funktioniert dies in MSSQL 2000?

So ja nicht, oder:
BEGIN TRANSACTION OuterTran

INSERT into
tblTest
(pkTestID)--ist ein Identity-Feld und würde bei einem Insert einen Fehler
erzeugen
values
(1)

IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION OuterTran
END

IF @@ERROR = 0
BEGIN
COMMIT TRANSACTION OuterTran
END

SELECT @@ERROR


lg
Charlie
Elmar Boye
2005-09-13 11:16:01 UTC
Permalink
Hallo Charlie,
Post by Charlie
also try und catch.
gibt es nicht.
Post by Charlie
Wie funktioniert dies in MSSQL 2000?
Generell musst Du @@ERROR einer Variable zuweisen wenn
Du sie mehr als einmalig, direkt nach der Anweisung prüfen willst.
Siehe http://www.sommarskog.se/error-handling-II.html#whencheck
Post by Charlie
BEGIN TRANSACTION OuterTran
In einem Trigger befindest Du dich bereits in einer Transaktion,
so dass dort nicht erforderlich (sinnvoll wäre).
Post by Charlie
INSERT into
tblTest
(pkTestID)--ist ein Identity-Feld und würde bei einem Insert einen
Fehler erzeugen
values
(1)
BEGIN
ROLLBACK TRANSACTION OuterTran
-- würde das zweite IF sparen...
RETURN
Post by Charlie
END
BEGIN
COMMIT TRANSACTION OuterTran
END
SELECT @@err
Gruss
Elmar
Charlie
2005-09-13 11:38:04 UTC
Permalink
Hallo Elmar,

ich habe jetzt mal dein Bsp nachgebaut:

DECLARE @err int

INSERT into
tblTest
(pkTestID)--ist ein Identity-Feld und würde bei einem Insert einen Fehler
erzeugen
values
(1)

SET @err = @@ERROR


IF @err <> 0
BEGIN
EXEC SP_WRITE_ERRORS @err
ROLLBACK TRANSACTION OuterTran
RETURN
END

SELECT @err

Und leider wird die SP nicht ausgeführt und auch nicht zum Schluss mit
SELECT @err der Fehlercode zurückgegeben.
Was stimmt nicht?

lg
Charlie
Post by Elmar Boye
Hallo Charlie,
Post by Charlie
also try und catch.
gibt es nicht.
Post by Charlie
Wie funktioniert dies in MSSQL 2000?
Du sie mehr als einmalig, direkt nach der Anweisung prüfen willst.
Siehe http://www.sommarskog.se/error-handling-II.html#whencheck
Post by Charlie
BEGIN TRANSACTION OuterTran
In einem Trigger befindest Du dich bereits in einer Transaktion,
so dass dort nicht erforderlich (sinnvoll wäre).
Post by Charlie
INSERT into
tblTest
(pkTestID)--ist ein Identity-Feld und würde bei einem Insert einen
Fehler erzeugen
values
(1)
BEGIN
ROLLBACK TRANSACTION OuterTran
-- würde das zweite IF sparen...
RETURN
Post by Charlie
END
BEGIN
COMMIT TRANSACTION OuterTran
END
Gruss
Elmar
Elmar Boye
2005-09-13 13:58:12 UTC
Permalink
Hallo Charlie,
Post by Charlie
INSERT into
tblTest
(pkTestID)--ist ein Identity-Feld und würde bei einem Insert einen
Fehler erzeugen
values
(1)
BEGIN
ROLLBACK TRANSACTION OuterTran
RETURN
END
Und leider wird die SP nicht ausgeführt und auch nicht zum Schluss mit
Was stimmt nicht?
siehe oben

Gruss
Elmar
Jens
2005-09-13 08:38:38 UTC
Permalink
http://www.sommarskog.se/error-handling-I.html

HTH, Jens Suessmeyer.
Charlie
2005-09-13 11:19:06 UTC
Permalink
Hallo,

wie funktioniert das Error-Handling in einem Trigger?

So funkioniert es zwar im Query-Analyzer, nicht aber im Trigger selbst:


CREATE TRIGGER TR_INS
ON dbo.tbltest
FOR INSERT
AS

declare @var1 int
declare @var2 varchar(50)
declare @var3 int
declare @intErrorCode int

Select @var1=var1, @var2=var2, @var3=var3 from Inserted

BEGIN TRAN
INSERT INTO tblTest
(
field1,
field2,
field3
)
values
(
@var1,
@var2,
@var3
)

SELECT @intErrorCode = @@ERROR
IF (@intErrorCode <> 0) GOTO PROBLEM
COMMIT TRAN

/*ERROR-Handling*/
PROBLEM:
IF (@intErrorCode <> 0)
BEGIN
EXEC SP_WRITE_ERRORS @intErrorCode
ROLLBACK TRAN
END




Was muss ich also anders machen, damit es im Trigger auch funktioniert.

lg
Charlie
Post by Frank Kalis
http://www.sommarskog.se/error-handling-I.html
HTH, Jens Suessmeyer.
Charlie
2005-09-15 10:03:02 UTC
Permalink
Hallo nochmals,

ich habe jetzt schon einige Artikel gelesen, aber besonders:
http://www.sommarskog.se/error-handling-I.html
UND
http://www.sommarskog.se/error-handling-II.html

ABER ich schaffe es einfach nicht.

Meine Aufgabe:
Bei einem Trigger wird eine SP angstossen und die soll nun via einer anderen
SP auf Fehler mitprotokolliert werden.
Also

create trigger...
...
..
BEGIN TRANS

EXEC @FEHLER = SP_TEST_SP @VALUE1
IF @FEHLER <> 0
BEGIN
ROLLBACK TRANS
EXEC SP_WRITE ERRORS @FEHLER
END
ELSE
BEGIN
COMMIT TRANS
END

Wenn aber nun in der SP_TEST_SP ein Fehler auftritt, dann wird der Batch
zwar unterbrochen, aber wie es eben bei einem Batch so ist, danach auch
nichts mehr ausgeführt.

Leider muss ich aber solche Fehler mitprotokillieren(=PARANOIA).
Ist eine meiner DB-Einstellungen falsch, oder mach ich andauernd was falsch?

Eine andere Überlegung war schon, dass ich es mit SQL Agent Jobs löse, denn
wenn ein Job fehlschlägt, dann kann ich ja angeben, dass ein anderer Step, in
meinem Fall also die SP_WRITE ERRORS ausgeführt wird, oder?

Wenn dies mit den SQL Agent Jobs machbar wäre, wie kann ich von einem
Trigger einen Job aufrufen?

jetzt schon vielen Dank für die Hilfe
lg
Charlie

Loading...