Problème de triggersur conceptuel T-SQL

Je place un triggersur sur une table dans le logiciel d'un vendeur (sur notre machine bien sûr) qui va créer un logging des chèques écrits dans un format spécifique pour notre banque (en raison du type d'entreprise, nous avons besoin jusqu'à la rapports minuscules sur les chèques rédigés pour la gestion de la fraude). J'ai déjà écrit une application robuste qui fait le travail, mais nous sums très inquiets de tout impact sur le logiciel principal. Par exemple, si quelque chose ne va pas dans le triggersur, tout le process d'insertion de l'application (avec plusieurs files) va vers le sud, et nous ne pouvons pas nous permettre de gâcher la production avec une application parallèle.

Nous allons donc écrire cet logging de suivi des chèques avec un minimum de données et le gérer d'une manière supprimée de l'application.

La question: y a-t-il un moyen de s'assurer que même si notre logging vierge ne peut pas écrire que l'INSERT dans le logiciel de notre fournisseur continue malgré tout?

Je trouve toujours que les opérations les plus stables sont basées:

INSERT INTO MyTable SELECT SomeValue FROM Inserted WHERE [logic here] 

Si la logique échoue, il inserta simplement zéro ligne.

Oui – n'utilisez pas de triggersur.

Au lieu de, dites:

 CREATE TRIGGER CheckSpy ON checks FOR AFTER INSERT AS INSERT INTO dbo.Spy(CheckID) SELECT CheckID FROM INSERTED WHERE type="Fraud" 

Vous pouvez simplement écrire une procédure stockée qui extrait les loggings insérés APRÈS qu'ils ont été écrits.

 INSERT INTO dbo.Spy(CheckID, ...) SELECT C.CheckID, ... FROM dbo.CheckID as I RIGHT OUTER JOIN dbo.Checks as C ON I.CheckID = C.CheckID WHERE I.checkID IS NULL AND I.Type = 'Fraud' 

Vous devez créer un au Instead of Insert Trigger , qui valide toutes datatables avant qu'elles ne soient insérées. Effectuez des controls de validation des données et, une fois satisfait, effectuez l'insertion, sinon, en cas d'échec, les controls de validation renvoient un message d'erreur convivial, indiquant aux users comment résoudre le problème et recommencer.

Après tout, vous ne voulez pas que vos clients s'en aillent juste parce que votre triggersur ne l'aime pas.

 CREATE TRIGGER tr_Trigger_Name ON Table_Name INSTEAD OF INSERT AS BEGIN BEGIN TRY /*DO your data validation checks here*/ IF (/*check No 1*/) BEGIN RAISERROR('Send this message to user to guide what to do', 16, 1) END IF (/*check No 2*/) BEGIN RAISERROR('Send this message to user to guide what to do', 16, 1) END /*Once Validation is done and you are happy to continue with the transaction*/ BEGIN TRANSACTION INSERT /* Insert data what ever you want*/ COMMIT TRANSACTION END TRY BEGIN CATCH /*If something has gone wrong During Validation of Data Insert*/ IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION /*DO other stuff here in case of an error or validation faliure */ END CATCH END