2017-05-05 14 views
0

在任何人建議一個唯一索引或密鑰之前,我有一個很好的例子。爲什麼我的觸發器避免重複的行不起作用?

我用這觸發,從Trigger to prevent Insertion for duplicate data of two columns

CREATE TRIGGER LogDuplicates ON bkPersonPoints 
FOR INSERT 
AS 
if exists (select * from bkPersonPoints c 
        inner join inserted i 
         on c.Name = i.Name and c.Points = i.Points) 
begin 
    rollback 
end 
GO 

這個答案被接受,並且具有15升的投票,所以我希望它的工作,但即使在我的第一個刀片,成空表:

insert bkPersonPoints (Name, Points) values ('Brady', 100) 

我得到的錯誤:

The transaction ended in the trigger. The batch has been aborted.

附錄:該表看起來是這樣的:

CREATE TABLE [dbo].[bkPersonPoints](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NOT NULL, 
    [Points] [int] NOT NULL 
) ON [APP_BR2_User] 
+2

斯科特對這個問題的答案註釋包含的信息的關鍵部分 - 你需要確保在'行插入在表格中**'不匹配*自己*(因爲這是觸發後的''''',插入的行已經在表格中) –

回答

3

發生這種情況,因爲它檢測您當前插入到表中的記錄。你需要篩選出EXISTS條款:反正

CREATE TRIGGER LogDuplicates ON bkPersonPoints 
FOR INSERT 
AS 
if exists (select * from bkPersonPoints c 
        inner join inserted i 
         on c.Name = i.Name 
         and c.Points = i.Points 
         and c.id <> i.id) 
begin 
    rollback 
end 
GO 
+0

是的,謝謝。我確實對已經存在的AFTER INSERT記錄有所懷疑,但是在我大聲呼喊答案的時候,PK的想法讓我不知所措。 – ProfK

0

,建議約束

ALTER TABLE bkPersonPoints 
    ADD CONSTRAINT c_uniq_Name_and_points UNIQUE (Name, Points) 
+2

**字面上**問題的第一行開始「之前有人建議一個唯一的索引或鍵...」 –

+0

更好地是一個不錯的情況下不使用特定的數據庫功能,旨在處理這種確切的情況... –

+0

@Damien_The_Unbeliever是的,但我想,沒有一點使用觸發器檢查唯一性,所以我建議:3 –