TSQL-trigger erstellen fehl
Habe ich einige code, der in einem after insert-trigger, die möglicherweise fehlschlagen. Ein solcher Fehler ist nicht entscheidend und sollte nicht rollback der Transaktion. Wie kann ich den Fehler abfangen innerhalb der trigger-und der rest der Transaktion ordnungsgemäß ausgeführt?
Das Beispiel unten zeigt, was ich meine. Der trigger absichtlich erzeugt eine Fehlerbedingung mit dem Ergebnis, dass die original-insert ( "1" ) nie Einfügungen in die Tabelle. Try/Catch hat nicht scheinen, um den trick zu tun. Eine ähnliche, ältere stack overflow Frage nicht Ertrag eine Antwort außer "verhindern, dass die Fehler auftreten in den ersten Platz" - das ist nicht immer möglich/einfach ist.
Irgendwelche anderen Ideen?
create table test
(
a int not null
);
go
create trigger testTrigger on test
after insert as
begin
insert into test select null;
end;
go
insert into test values ( 1 );
- Warum Try/Catch nicht funktioniert?
- da Verstöße gegen die Vorgaben innerhalb der Trigger doom der Transaktionen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen trigger nicht Versagen können, und haben immer noch die Transaktion roll forward. Sie haben ein paar Optionen, um sicherzustellen, dass die trigger nicht scheitern.
1 - können Sie sicherstellen, dass die nach nicht scheitern, durch duplizieren der Logik, die zur überprüfung der Einschränkungen und nicht versucht, eine operation gegen die Auflagen:
d.h.
2 - Sie können verschieben die potenziell fehlerhaften Aktion, indem Sie mit Hilfe des queue-design-Muster, wo die Handlungen, die möglicherweise oder möglicherweise nicht fehl, werden in der Warteschlange von enqueueing zu einem Tisch, wo die enqueueing der Betrieb kann unmöglich scheitern.
d.h.
Aufgrund der Art und Weise Triggern implementiert werden, in
SQL Server
alle Verstöße gegen die Vorgaben innerhalb der Trigger doom der Transaktionen.Dies ist dasselbe wie:
die Ergebnisse in einer dem Untergang geweihten Transaktion, außer dass es keine Möglichkeit zum deaktivieren
XACT_ABORT
in einem trigger.SQL Server
fehlt auch autonome Transaktionen.Das ist ein weiterer Grund, warum sollten Sie alles, was Sie Logik in den gespeicherten Prozeduren eher als Trigger.
ERP
system, das nicht unter Ihrer Kontrolle ist. Das beste, was Sie tun können, ist die Abfrage derERP
Tabellen direkt von Ihnen-Datenbank, verwenden Sie eine Replikation (die Einführung ein wenig Verzögerung) oder eine Kombination aus beiden verwenden die Auswirkungen zu minimieren und die lag.