Frage

Ich habe einen Auslöser beim Einfügen, aber wenn der Auslöser fehlschlägt, schlägt der Einsatz ebenfalls fehl.

Gibt es eine Möglichkeit, den Insert weiterzumachen, auch wenn der Auslöser fehlschlägt?

Bearbeiten: Ich verwende einen Auslöser, um eine E -Mail zu senden, wenn ein neuer Datensatz eingegeben wird. Ich möchte, dass der Datensatz gespeichert wird, unabhängig davon, ob die E -Mail gesendet wurde oder nicht.

Wie würde ich das von einem SP machen?

War es hilfreich?

Lösung

Nein

  • Ein Auslöser ist Teil der Transaktion
  • Ein Fehler abbricht die Anweisung Insert (falls nicht in einer expliziten Transaktion)
  • Ein Fehler in einem Auslöser wird eine Transaktion zum Scheitern verurteilt (dh, muss zurückgerollt werden)
  • Ein Fehler in einem Auslöser, bei dem Try/Catch -Blöcke sind nicht Wird verwendet (auch um den Einsatz), die Charge abbricht

Verwenden Sie keinen Auslöser. Verwenden Sie stattdessen eine gespeicherte Prozedur, um die Logik aus dem Einfügen zu entkoppeln.

Persönlich bedeutet ein Ausfall, dass ein komplexer DRI fehlgeschlagen ist oder ich nicht in eine Geschichte Tabelle schreiben kann. Das ist eine schlechte Sache ...

Bearbeiten:

  • Verwenden Sie Service Broker, um eine Benachrichtigung aus dem Abzug zu senden.
  • Ein weiterer Code nimmt es auf und sendet asynchron

Ich habe mich nicht implementiert, also muss ich Sie verweisen Google

Andere Tipps

Wenn Sie mit dem Service Broker nicht vertraut sind, können Sie den Auslöser weiterhin verwenden, aber anstatt die E -Mail zu senden, wird der Inhalt der E -Mail in eine Art E -Mailqueue -Tabelle eingefügt. Sie würden dann einen asynchronoualen Prozess regelmäßig überprüft und die E -Mails separat verarbeiten, wodurch sie beim Versenden aus der Warteschlange löschen.

Wenn Sie die Erzeugung der E -Mail mit dem Versenden der Post entkoppeln, wird verhindert, dass die Einfügungen fehlschlagen, und ermöglicht es Ihnen, E -Mails zu beheben, während Sie gleichzeitig neue Mails erfassen, die gesendet werden sollen.

JAWOHL

Der Auslöser schlägt bei seinen normalen Anweisungen, Nullwerten usw. fehl

:: Verwenden Sie einen anstelle von Einfügen von Trigger -Start mit einem Einfügen mit

Wählen Sie in #inserted aus eingefügt

deklarieren @Query nvarchar (max), @iretval int

:: Sie können den Fehler umgehen, indem Sie jede Anweisung in eine Abfrage erstellen

set @query = n'Update .... etc '

:: Es ist auch eine gute Idee, die Abfrage vor dem sp_executesql zu überprüfen, weil :: Wenn die Abfrage null ist, dann wird das Iretval sowieso 0, dh dh dh dh

Wenn @Query null beginnt set @iretval = 999 Goto letztes Ende

::dann

exec @iretval = sp_executesql @Query [[Parmameters] Outvalue] if @iretval> 0

:: Ihr Einsatz sollte ein Flag oder etwas zeigen, um anzuzeigen, ob der Auslöser funktioniert hat und eine nachfolgende Verarbeitung ermöglichte, die der Auslöser nicht unter der Annahme des Annehmens ermöglichte, dies ist erforderlich

Letzte

if @iretval = 0 update #inserted set flag = OK

In die Tabelle einfügen ausgewählt * aus #inserted

::Hinweis. Sie müssen jede Anweisung überprüfen. Wenn Sie Werte aus anderen Tabellen abrufen müssen, überprüfen Sie, ob die Werte gültig sind und nicht.

Wenn jemand ein Beispiel. Senden Sie mir eine E -Mail an jhodgson@tsti.co.za

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top