触发将数据识别为重复数据

Trigger recognising data as duplicates when it isn't

我在 SQL 服务器中有这个触发器:

CREATE TRIGGER MyTrigger ON [dbo].[practiseduplicates]   
AFTER INSERT
AS
    IF EXISTS (SELECT * 
               FROM [practiseduplicates] t 
               INNER JOIN inserted i ON i.[money] = t.[money] 
                                     AND i.[Name] = t.[Name] 
                                     AND i.[year month] = t.[year month])
    BEGIN
        ROLLBACK
        RAISERROR ('Duplicated Data', 16, 1);
    END

然后我插入这些值(它们已经在数据 table 中):

insert into [practiseduplicates]
values ('2017-02', 'buzzlightyear', '10.09')

当我单击“执行”时,我预计会弹出错误消息...它确实弹出了,但是当我将值更改为我知道不在数据中的信息时 table

例如

'2056-12', 'mr potato head', '12345.09'

仍然弹出错误消息,而实际上它应该只是将数据插入table,谁知道为什么会这样?

我怀疑这与我的内部连接语句有关,但我不确定。

引用自您的问题

When I click execute I expected the error message to pop up... which it did, however when I change the values to information that I know is not in the data table

该语句的斜体部分不太准确,因为即使这些值之前不在 table 中,但在您 运行 插入之后,它们仍然存在。触发器将触发。

简而言之,您正在创建一个 AFTER INSERT 触发器并检查插入到 table 的数据是否已经在 table 中(插入后是运行)。当然触发器每次都会触发,因为如果数据在插入的 table 中,它在 table 中(因为它刚刚插入)。

所以基本上我使用约束而不是触发器语句来解决这个问题。

ALTER TABLE [dbo].[practiseduplicates]    
ADD CONSTRAINT [constraintforduplicates] UNIQUE NONCLUSTERED
( [column name],
[column name], etc etc
)

这将停止使用您在约束语句中声明的列作为要比较的数据的任何重复项,如果它们是重复项则进行标记,并且不会将数据插入 table。

请注意,语句中的列本身有 900 字节的限制。因此,例如,如果您有 varchar (max) 列,则约束不会 运行 因为它可以做的最大值是 900 字节。在我的脚本中,我输入了 varchar (800).