Sql 为什么避免重复行的触发器不起作用?

Sql 为什么避免重复行的触发器不起作用?,sql,sql-server,tsql,triggers,sql-server-2012,Sql,Sql Server,Tsql,Triggers,Sql Server 2012,在任何人提出一个唯一的索引或键之前,我有一个很好的例子 我正在使用此触发器,来自: 这个答案被接受,并获得了15票以上的支持,因此我希望它能起作用,即使是在我第一次插入时,也能进入一个空表: insert bkPersonPoints (Name, Points) values ('Brady', 100) 我得到一个错误: 事务在触发器中结束。批处理已中止 附录:该表如下所示: CREATE TABLE [dbo].[bkPersonPoints]( [Id] [int] IDENT

在任何人提出一个唯一的索引或键之前,我有一个很好的例子

我正在使用此触发器,来自:

这个答案被接受,并获得了15票以上的支持,因此我希望它能起作用,即使是在我第一次插入时,也能进入一个空表:

insert bkPersonPoints (Name, Points) values ('Brady', 100)
我得到一个错误:

事务在触发器中结束。批处理已中止

附录:该表如下所示:

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

发生这种情况是因为它正在检测您当前插入到表中的记录。您需要从EXISTS子句中筛选出:


发生这种情况是因为它正在检测您当前插入到表中的记录。您需要从EXISTS子句中筛选出:


不管怎样,建议约束

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

不管怎样,建议约束

ALTER TABLE bkPersonPoints
  ADD CONSTRAINT c_uniq_Name_and_points UNIQUE (Name, Points)
这个答案的灵感来源于一篇发表于4月13日20日18:34的文章

在dbo.MyTable上创建触发器MyTrigger 而不是插入 作为

如果不存在 从MyT表中选择* 内连接插入i 在i.name=t.name和i.date=t.date和i.id t.id上 开始 插入MyTable名称、日期选择名称、插入日期 终止 其他的 抛出51000,'语句终止,因为找到了对象的重复项',1; 去

这个答案的灵感来源于一篇发表于4月13日20日18:34的文章

在dbo.MyTable上创建触发器MyTrigger 而不是插入 作为

如果不存在 从MyT表中选择* 内连接插入i 在i.name=t.name和i.date=t.date和i.id t.id上 开始 插入MyTable名称、日期选择名称、插入日期 终止 其他的 抛出51000,'语句终止,因为找到了对象的重复项',1;
go

Scott对该答案的评论包含一条关键信息-您需要确保插入的行与表中的行不匹配,因为这是for/after触发器,插入的行已经在tableScott对答案的注释中,该注释包含一条关键信息-您需要确保插入的行与表中的行不匹配,因为这是for/after触发器,插入的行已经在表中了。从字面上看,问题的第一行在任何人建议唯一索引或键之前就开始了…最好不要使用专门为处理这种情况而设计的特定数据库功能…@Damien_the_Noisever是的,但我想,使用触发器检查唯一性是没有意义的,所以我建议:3My用例不一定只是阻止插入记录,而是记录潜在的重复,并希望记录导致重复插入的原因。我甚至可能不需要阻止插入,而只需要将复制品上的金额归零。唯一键除了阻止插入外,对任何一种情况都是无用的。从字面上来说,问题的第一行在任何人建议唯一索引或键之前开始…最好是一个非常好的例子,不要使用专门设计用于处理这种确切情况的特定数据库功能…@Damien_the_Insiver是的,但我想,使用触发器检查唯一性是没有意义的,所以我建议:3My用例不一定只是阻止插入记录,而是记录潜在的重复,并希望记录导致重复插入的原因。我甚至可能不需要阻止插入,而只需要将复制品上的金额归零。唯一密钥除了阻止插入外,对任何其他功能都没有用处。是的,谢谢。我确实对插入后已经存在的记录有一些怀疑,但在我大声要求回答的过程中,PK的想法让我无法理解。是的,谢谢。我确实对插入后已经存在的记录有一些怀疑,但在我大声要求答案的过程中,PK的想法让我无法理解。
ALTER TABLE bkPersonPoints
  ADD CONSTRAINT c_uniq_Name_and_points UNIQUE (Name, Points)