2010-03-07 6 views
0

J'ai la table que j'insérer des données avec requête suivante (à partir du code C#):Création d'un déclencheur dans SQL Server 2005 (doit également fonctionner en 2008) pour éviter les doublons?

INSERT INTO [BazaZarzadzanie].[dbo].[Wycena] 
    ([KlienciPortfeleKontaID] 
    ,[WycenaData] 
    ,[WycenaTyp] 
    ,[WycenaWartosc] 
    ,[WycenaWaluta] 
    ,[WycenaUzytkownik] 
    ,[WycenaUzytkownikData]) 
VALUES 
    (@varKlienciPortfeleKontaID 
    ,@varWycenaData 
    ,@varWycenaTyp 
    ,@varWycenaWartosc 
    ,@varWycenaWaluta 
    ,@varWycenaUzytkownik 
    ,@varWycenaUzytkownikData) 

Table script de création ressemble à ceci:

CREATE TABLE [dbo].[Wycena](
[KlienciPortfeleKontaID] [int] NULL, 
[WycenaData] [datetime] NULL, 
[WycenaTyp] [int] NULL, 
[InID] [int] NULL, 
[WycenaIlosc] [decimal](18, 2) NULL, 
[WycenaCena] [decimal](18, 2) NULL, 
[WycenaWartosc] [decimal](18, 2) NULL, 
[WycenaWaluta] [nvarchar](3) NULL, 
[WycenaUzytkownik] [nvarchar](50) NULL, 
[WycenaUzytkownikData] [datetime] NULL 
) ON [PRIMARY] 

Il a également deux clés étrangères, mais rien que je pourrait faire une clé primaire/unique. Donc, j'ai pensé à éviter les doublons, je voudrais un déclencheur puisque pour savoir une ligne est en double, je dois réellement tester chaque valeur de cette rangée (bien peut-être pas 2 dernières colonnes)? Cette table a environ 2mln lignes.

Est-ce une bonne idée? Ou y a-t-il un meilleur moyen?

est Ci-dessous déclencheur J'ai créé (non testé si elle fonctionne):

CREATE TRIGGER [dbo].[trg_WycenaDuplicateCheck] 
    ON [dbo].[Wycena] FOR INSERT 
AS 

IF EXISTS(SELECT INSERTED.[KlienciPortfeleKontaID] 
    ,INSERTED.[WycenaData] 
    ,INSERTED.[WycenaTyp] 
    ,INSERTED.[InID] 
    ,INSERTED.[WycenaIlosc] 
    ,INSERTED.[WycenaCena] 
    ,INSERTED.[WycenaWartosc] 
    ,INSERTED.[WycenaWaluta] 
    FROM INSERTED, Wycena 
    WHERE INSERTED.[KlienciPortfeleKontaID] = Wycena.[KlienciPortfeleKontaID] 
    AND INSERTED.[WycenaData] = Wycena.[WycenaData] 
    AND INSERTED.[WycenaTyp] = Wycena.[WycenaTyp] 
AND INSERTED.[InID] = Wycena.[InID] 
    AND INSERTED.[WycenaIlosc] = Wycena.[WycenaIlosc] 
    AND INSERTED.[WycenaCena] = Wycena.[WycenaCena] 
     AND INSERTED.[WycenaWartosc] = Wycena.[WycenaWartosc] 
    AND INSERTED.[WycenaWaluta] = Wycena.[WycenaWaluta] 
    Group By INSERTED.[KlienciPortfeleKontaID] 
    ,INSERTED.[WycenaData] 
    ,INSERTED.[WycenaTyp] 
    ,INSERTED.[InID] 
    ,INSERTED.[WycenaIlosc] 
    ,INSERTED.[WycenaCena] 
    ,INSERTED.[WycenaWartosc] 
    ,INSERTED.[WycenaWaluta] 
    HAVING COUNT (*) > 1) 

BEGIN 
RAISERROR('>>>DUPLICATES PREVENTED<<< ',10,1) 
ROLLBACK TRAN 
END 

Répondre

7

Créer un index « unique » sur les champs qui vous intéressent.

CREATE UNIQUE INDEX IX_YOUR_FAVORITE_NAME 
    ON [dbo].[Wycena](... list of columns goes here ...) 
+0

Ils sont uniques si tous sont vérifiés en même temps? Est-ce que ça va le gérer? – MadBoy

+0

Euh ... Je ne sais pas exactement ce que vous demandez. Lorsque vous créez un index unique sur plusieurs champs, le serveur de base de données ne vous permet pas de créer un nouvel enregistrement si les champs du nouvel enregistrement correspondent tous à un ancien enregistrement déjà enregistré dans l'index. – Pointy

+0

C'est ce que je voulais savoir. Merci – MadBoy

Questions connexes