在SQL Server 2005中创建触发器(也必须在2008年工作)以防止重复?

Mad*_*Boy 0 triggers sql-server-2005 sql-server-2008

我有表,我插入数据与以下查询(从c#代码):

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

表创建脚本如下所示:

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]
Run Code Online (Sandbox Code Playgroud)

它还有几个外键,但我没有任何东西可以制作主键/唯一键.所以我想防止重复,我会去触发,因为知道一行是重复我实际上必须测试该行的每一个值(也许不是最后一列2)?该表有大约2mln行.

这是个好主意吗?或者,还有更好的方法?

下面是我创建的触发器(未测试是否有效):

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
Run Code Online (Sandbox Code Playgroud)

Poi*_*nty 7

在您关注的字段上创建"唯一"索引.

CREATE UNIQUE INDEX IX_YOUR_FAVORITE_NAME
  ON [dbo].[Wycena](... list of columns goes here ...)
Run Code Online (Sandbox Code Playgroud)