我有一个表,其中AutoIdentity列为PK,nvarchar列为“IdentificationCode”。我想要的只是在插入一个新行时,它将在表中搜索任何预先存在的IdentificationCode,如果找到任何已回滚的事务。
我写了下面的触发器:
ALTER trigger [dbo].[Disallow_Duplicate_Ids]
on [dbo].[tbl1]
for insert
as
if ((select COUNT(*) from dbo.tbl1 e , inserted i where e.IdentificationNo = i.IdentificationNo ) > 0)
begin
RAISERROR('Multiple Ids detected',16,1)
ROLLBACK TRANSACTION
end
但是当插入新行时,即使没有这样的IdentificationCode,它也总是会触发回滚。
任何人都可以帮助我吗?
感谢
答案 0 :(得分:3)
正如@Qpirate所提到的,你应该对列进行某种UNIQUE
约束。这可能更强大'而不是使用触发器,因为有那些方法来禁用它们
此外,隐式连接语法(逗号分隔的FROM
子句)被视为SQL反模式 - 如果可能,请始终明确声明您的连接。
我怀疑您的错误是因为您的触发器似乎是AFTER
触发器,并且您检查表中是否有任何(非零)行;换句话说,触发器(可能)“失败”' INSERT
,因为是INSERT
。将其更改为BEFORE
(或INSTEAD OF
)触发器,或将计数更改为>= 2
可能会解决问题。
如果没有看到您的插入声明,则无法确定,但(特别是如果您使用的是SP),您可以在INSERT
语句中检查是否存在如果没有插入行,则抛出错误(或做其他事情)
例如,以下内容:
INSERT INTO tbl1 (identificationCode, *otherColumns*)
VALUES (@identificationCode, *otherColumns)
WHERE NOT EXISTS (SELECT '1'
FROM tbl1
WHERE identificationCode = @identificationCode)
将返回一个代码,表示未找到行' (插入等;几乎每个系统都是SQLCODE = 100
)如果identificationCode
已经存在。
答案 1 :(得分:0)
使用EXISTS检查IdentificationCode是否已存在。
If EXISTS (Select * from tbl1 where IdentificationCode = @IdentificationCode )
BEGIN
//do something
END
Else
BEGIN
//do something
END