2010-10-27 2 views
2

J'ai une table qui a 4 champs.Sql Server Triggers

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: quand un nouvel enregistrement inséré par l'utilisateur qui ont même valeur comme un enregistrement existe avant sur la table comme ci-dessous:

Il y avait ce dossier:

X Y Z 2 

Nouveau record

X Y Z 3 

mise à jour enregistrement existant au-dessous:

X Y Z 5 

et également d'empêcher l'insertion d'un enregistrement en double. J'ai écrit un déclencheur 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 
+1

Si votre clé primaire est '(col1, col2, col3)', l'utilisateur ne pourra jamais insérer 'X Y Z 3' quand' X Y Z 2' existe déjà. Cela violerait votre clé primaire. –

+0

@Joe Oui, vous avez raison, avant de faire cela j'ai créé ces clés primaires pour éviter de dupliquer, mais maintenant je veux mettre à jour l'enregistrement qui existe dans la table, donc après avoir résolu ce problème, je vais supprimer les clés primaires ou étendre à quatre cols;) – Sadegh

+1

@Sadegh: Pourquoi essayez-vous de mettre cela dans un déclencheur du tout? Pourquoi ne pouvez-vous pas tester l'existence dans votre code et mettre à jour/insérer le cas échéant à ce moment-là. –

Répondre

1

Je vais consolider mes commentaires dans une réponse.

J'éviterais d'utiliser un déclencheur 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....

+0

Cher Joe, je n'utilise vraiment pas de sp dans mon application, j'utilise DLINQ pour faire n'importe quoi! et parce que je vais résoudre mon problème par un trigger;) – Sadegh

1

Si vous utilisez SQL Server 2008, vous pouvez utiliser MERGE

+0

Merci c'est génial – Sadegh

1

Comme Joe Stefanelli dit, la meilleure approche est de remplacer les inserts directs dans la table en ayant un insert ou de mise à jour proc stocké et révoquant les perms INSERT sur la table.

Cependant, si vous êtes mort mis sur la gâchette, essayez d'ajouter ce qui suit à la gâchette

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];