web-dev-qa-db-fra.com

La gâchette ne doit pas bloquer l'insert

J'ai une gâchette sur INSERT mais si la gâchette échoue, l'insert échoue également.

existe-t-il un moyen de laisser l'insertion procéder même si la gâchette échoue?

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

Comment ferais-je cela d'un SP?

6
Ezi

Non

  • Un déclencheur fait partie de la transaction
  • Une erreur abandonnera l'instruction insertion (sinon dans une transaction explicite)
  • Une erreur dans un déclencheur fera mal une transaction (c'est-à-dire dû à être renvoyée)
  • Une erreur dans une gâchette où Essayer/Catch Blocks est non utilisé (autour de l'insert aussi) abandonnera le lot

N'utilisez pas de gâchette. Utilisez une procédure stockée à la place pour découpler la logique de l'insert.

Personnellement, un défaillance de la gâchette signifie que certains DRI complexe ont échoué ou que je ne peux pas écrire à une table d'histoire. C'est une mauvaise chose ...

Éditer:

  • Utilisez le courtier de service pour envoyer une notification à partir de la gâchette.
  • Un autre morceau de code va le ramasser et envoyer de manière asynchrone

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

10
gbn

Si vous n'êtes pas à l'aise avec le courtier de service, vous pouvez toujours utiliser la gâchette, mais au lieu d'envoyer le courrier électronique, il insère le contenu de l'e-mail dans une sorte de table EmailQueue. Vous auriez alors un processus d'asynchronouse vérifiant périodiquement cette table et traiter les courriels séparément, les supprimant de la file d'attente lorsqu'il est envoyé.

Le découplage de la génération du courrier avec l'envoi du courrier empêchera les insertions de défaillance et vous permettra de résoudre les problèmes de courrier tout en capturant de nouveaux mails à envoyer.

5
datagod

OUI

La gâchette échoue sur ses instructions normales, des valeurs nulles, etc.

:: Utilisez un commentaire au lieu d'insérer le début de la gâchette avec

sélectionnez dans #inserted de l'inséré

déclarer @query nvarchar (max), @ iretval int

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

sET @ QUERY = N'UPDATE .... etc '

:: C'est également une bonne idée de vérifier la requête avant le sp_executesql, car :: Si la requête est NULL, alors l'IRETVAL sera de 0'ywayway I.e.

si @Quisery est Null, commence Set @ iretval = 999 goto dernière fin

::ensuite

eXEC @ IRETVAL = SP_EXECUTSQL @Query [[Parmametteurs] Outvalue] Si @iretval> 0 goto Dernier

:: Votre insert doit porter un drapeau ou quelque chose à montrer si le déclencheur a fonctionné permettant un traitement ultérieur que le déclencheur n'a pas fait en supposant que cela soit requis.

Dernier

si @ iretval = 0 mise à jour #insered Set drapeau = OK

insérer dans la table Select * à partir de #inserted

::Remarque. Vous devez vérifier chaque instruction et si vous devez récupérer des valeurs à partir d'autres tables, vérifiez que les valeurs sont valides et non ISNULL.

si Anywants un exemple. email me [email protected]

0
jerry Hodgson