Sql Server Triggers

J'ai une table qui a 4 champs.

Col1 Guid Primary-Key (FK to another table) Col2 Guid Primary-Key (FK to another table) Col3 Int Primary-Key Col4 Int 

Maintenant je veux faire ceci: quand un nouvel logging inséré par l'user qui a la même valeur qu'un logging existe avant sur la table comme ci-dessous:

Il y avait ce record:

 XYZ 2 

Nouvel logging

 XYZ 3 

Mettre à jour l'logging existant ci-dessous:

 XYZ 5 

et empêchent également d'insert l'logging en double. J'ai écrit un triggersur très basique. Aidez-moi maintenant à compléter ceci. Merci d'avance. 😉

 CREATE TRIGGER [Tbl].[TriggerName] ON [dbo].[Tbl] AFTER INSERT, UPDATE AS BEGIN SET NOCOUNT ON; UPDATE [dbo].[Tbl] SET [dbo].[Tbl].[Col4] += [Inserted].[Col4] From [dbo].[Tbl] INNER JOIN [Inserted] ON [dbo].[Tbl].[Col1] = [Inserted].[Col1] AND [dbo].[Tbl].[Col2] = [Inserted].[Col2] WHERE [dbo].[Tbl].[Col3] = [Inserted].[Col3]; //How to prevent from inserting duplicate record? END 

Je vais consolider mes commentaires dans une réponse.

J'éviterais d'utiliser un triggersur dans ce cas. Je crois que votre meilleure approche consiste à écrire une procédure stockée que vous pouvez appeler à partir de votre code. Cette procédure stockée exécuterait la logique if exists... update... else insert...

Si vous utilisez SQL Server 2008, vous pouvez utiliser MERGE

Comme l'a dit Joe Stefanelli, l'approche BEST consiste à replace les insertions directes dans la table par un process stocké insert-or-update et à révoquer les perms INSERT sur la table.

Cependant, si vous êtes complètement sur le triggersur, essayez d'append ce qui suit au triggersur

 DELETE [dbo].[Tbl] From [dbo].[Tbl] INNER JOIN [Inserted] ON [dbo].[Tbl].[Col1] = [Inserted].[Col1] AND [dbo].[Tbl].[Col2] = [Inserted].[Col2] WHERE [dbo].[Tbl].[Col3] = [Inserted].[Col3] AND [dbo].[Tbl].[Col4] = [Inserted].[Col4];