2009-06-09 5 views
0

Ich habe das Gefühl, das ist vielleicht nicht möglich, aber hier geht ...Handle Fehler in SQL-Trigger ohne fehlgeschlagene Transaktion?

Ich habe eine Tabelle, die einen Insert-Trigger hat. Wenn Daten in diese Tabelle eingefügt werden, löst der Trigger eine lange varbinäre Spalte aus und analysiert sie. Dieser Trigger führt einige Operationen an den Binärdaten durch und schreibt mehrere Einträge in eine zweite Tabelle.

Was ich kürzlich entdeckt habe, ist, dass manchmal die binären Daten nicht "korrekt" sind (dh es entspricht nicht der Spezifikation, die es haben soll - ich habe KEINE Kontrolle darüber) und dies kann Casting-Fehler usw. verursachen.

Meine erste Reaktion war es, Dinge in TRY/CATCH-Blöcke zu wickeln, aber es scheint, dies ist auch keine Lösung, da die Ausführung des CATCH bedeutet die Transaktion ist zum Scheitern verurteilt und ich bekomme einen Fehler "Transaktion in Trigger".

Was ist wichtig ist, dass die Daten noch in die ursprüngliche Tabelle geschrieben werden. Es ist mir egal, ob die Daten in die zweite Tabelle geschrieben werden oder nicht.

Ich bin mir nicht sicher, ob ich das schaffen kann oder nicht und würde dankbar jeden Rat erhalten.

Antwort

1

was Sie tun könnten, ist eine Transaktion in einem Trigger zu begehen und dann diese Besetzung durchzuführen. Ich weiß nicht, ob das eine mögliche Lösung für Ihr Problem ist.

Eine andere Option wäre, eine Funktion IsYourBinaryValueOK zu erstellen, die den Spaltenwert überprüft. aber die Prüfung hätte mit gemacht werden müssen, um keinen Fehler zu verursachen.

+0

Einen Versuch wert, danke für die Idee. – Valerion

+0

Ja, diese Idee funktionierte großartig - eine kleine Funktion, um jedes Zeichen zu überprüfen, ob es in '1', '2', '3' usw. ist - wenn es zu irgendeinem Zeitpunkt nicht zurückgegeben wird, wird es sonst 0 zurückgeben gib das Ergebnis der Besetzung zurück. Scheint, den Job gut zu machen! – Valerion

+0

@Valerion - Sie können auch die Funktion IsNumeric() aufrufen, aber für Ihre Bedürfnisse ist sie möglicherweise zu locker. – ahains

1

Es klingt nicht wie dieser Code in einem Insert-Trigger ausgeführt werden sollte, da es konzeptionell zwei verschiedene Transaktionen ist. Sie wären wahrscheinlich besser mit asynchronen Verarbeitung wie Service-Broker, ein Hintergrund Nanny-Aufgabe, die für 'nicht fertig' Arbeit, etc. Sie könnten auch damit umgehen, indem Sie eine Sproc, um die Einfügung in einer Transaktion und dann es aufrufen zu tun der Do-Other-Work-Code danach.

Wenn Sie es unbedingt im Trigger tun müssen, dann brauchen Sie im Grunde eine autonome Transaktion. Für einige Ideen siehe this link (die Techniken gelten auch für SQL 2005).

+0

Guter Link und interessante Lektüre, obwohl ich mit der anderen Antwort gegangen bin. Einverstanden, dass im Nachhinein vielleicht ein Auslöser nicht unbedingt der beste ist, aber er passt besser in das Konzept des Rests des Systems und ist leichter zu verwalten. Am Ende habe ich durch die Verwendung einer Funktion tatsächlich vermieden, dass der Fehler zuerst auftritt, was meiner Meinung nach besser ist, als zu versuchen, es zu umgehen. – Valerion

Verwandte Themen