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

发布于 2024-08-23 17:36:54 字数 2130 浏览 0 评论 0原文

我有一个表,我使用以下查询插入数据(来自 c# 代码):

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

表创建脚本如下所示:

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]

它还有几个外键,但我无法创建主/唯一键。所以我想防止重复,我会使用触发器,因为要知道一行是重复的,我实际上必须测试该行的每个值(也许不是最后两列)?该表大约有 200 万行。

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

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

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

I have table that I insert data with following query (from c# code):

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

Table creation script looks like this:

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]

It also has couple of foreign keys but nothing that i could make primary/unique key. So i thought to prevent duplicates i would go for a trigger since to know one row is duplicate i actually have to test every single value of that row (well maybe not 2 last columns) ? This table has around 2mln rows.

Is this good idea? Or is there a better way?

Below is trigger I've created (not tested if it works):

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

稳稳的幸福 2024-08-30 17:36:54

在您关心的字段上创建“唯一”索引。

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

Create a "unique" index on the fields you care about.

CREATE UNIQUE INDEX IX_YOUR_FAVORITE_NAME
  ON [dbo].[Wycena](... list of columns goes here ...)
单调的奢华 2024-08-30 17:36:54

似乎您需要查看唯一约束

Seems like you need to look at UNIQUE Constraints

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文