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?
Non
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:
Je ne me suis pas mis en œuvre, je vais devoir vous référer à Google
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.
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]