Question

J'ai un déclencheur sur insert mais si la gâchette ne l'insert échoue aussi.

est-il un moyen de laisser l'insert procéder même si le déclencheur échoue?

EDIT: J'utilise un déclencheur pour envoyer un e-mail lorsqu'un nouvel enregistrement est entré. Je veux que le dossier soit enregistré, peu importe si l'e-mail a été envoyé ou non ..

Comment puis-je faire à partir d'une sp?

Était-ce utile?

La solution

Non

  • Un déclencheur fait partie de la transaction
  • Une erreur annulera l'instruction INSERT (sinon dans une transaction explicite)
  • Une erreur dans un déclencheur va condamner une transaction (qui est, doit être annulée)
  • Une erreur dans un déclencheur où des blocs / CAPTURE sont ESSAYEZ pas utilisé (autour de l'INSERT trop) abandonnera le lot

Ne pas utiliser un déclencheur. Utiliser une procédure stockée au lieu de découpler la logique de l'insert.

Personnellement, un déclencheur ne signifie que certains DRI a échoué complexe ou je ne peux pas écrire sur une table d'historique. C'est une mauvaise chose ...

Edit:

  • Utiliser Service Broker pour envoyer une notification de la détente.
  • Un autre morceau de code ramasser et d'envoyer de manière asynchrone

Je ne me suis pas mis en œuvre alors je vais devoir vous référer à Google

Autres conseils

Si vous n'êtes pas à l'aise avec Service Broker, vous pouvez toujours utiliser le déclencheur, mais au lieu d'envoyer l'e-mail, il insère le contenu de l'e-mail dans une sorte de tableau EmailQueue. Vous auriez alors un processus de asynchronouse vérifier périodiquement la table et de traiter les e-mails séparément, de les supprimer de la file d'attente lors de l'envoi.

Découplage la production du courrier avec l'envoi du courrier empêchera les inserts de ne pas, et vous permettra de problèmes de messagerie Résoudre les problèmes tout en capturant les nouveaux messages à envoyer.

OUI

Le déclencheur échoue sur ses instructions normales, les valeurs nulles, etc

:: Utilisez un début de déclenchement au lieu d'insérer avec

select into #inserted de Inséré

declare @query nvarchar (max), @ int iretval

:: Vous pouvez contourner l'échec en construisant chaque instruction dans une requête

set @ query = N'update .... etc «

:: il est aussi une bonne idée de vérifier avant la requête sp_executesql, parce que :: si la requête est nul alors la iretval sera 0 de toute façon à savoir

si @Query est nulle commencer Set @ iretval = 999 goto dernière fin

:: puis

exec @ Iretval = sp_executesql @query [[parmameters] outvalue] si @iretval> 0 goto Dernière

:: votre insert doit porter un drapeau ou quelque chose à montrer si le déclencheur a travaillé permettant un traitement ultérieur que le déclencheur n'a pas fait l'hypothèse où cela est nécessaire

Dernière

si @ iretval = 0 mise à jour #inserted set flag = ok

insérer dans la table select * from #inserted

:: Note. vous devez vérifier chaque déclaration, et si vous devez récupérer les valeurs des autres tables vérifier les valeurs sont valides et non isnull.

si anywants un exemple. Envoyez-moi jhodgson@tsti.co.za

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top