【发布时间】:2015-07-23 23:47:46
【问题描述】:
我需要编写一个触发器来防止同时插入多个记录,并检查该位置是否已经在数据库中。代码可以编译,但不能正常工作 - 即使我尝试添加不存在的地址,它也会显示错误消息
这是我的代码:
CREATE TRIGGER address_duplicate ON place
AFTER INSERT
AS
BEGIN
DECLARE @counter INT
SELECT @counter=COUNT(*) FROM place WHERE street IN (SELECT street FROM inserted) AND number IN(SELECT number FROM inserted)
AND city IN(SELECT city FROM inserted) AND postcode IN(SELECT postcode FROM inserted)
IF @counter>0
BEGIN
RAISERROR('This record is already in the database',1,1)
ROLLBACK
END
IF @@ROWCOUNT>1
BEGIN
RAISERROR('You can add only one record at the same time',1,2)
ROLLBACK
END
END
GO
【问题讨论】:
-
目前尚不清楚导致这种情况的逻辑是什么,但我认为唯一索引会比触发器容易得多。
-
在重复项上,为什么不添加唯一约束。阻止用户在语句中插入多个插入解决了什么问题。它们只能有多个插入语句。
-
您可能想要检查
INSERT和UPDATE上的重复项。如果您不需要特定的重复次数,您应该使用EXISTS。在重复条件下将inserted与您的数据表 (place) 连接,以处理触发器中的多个集合操作(多行)。如果有任何失败,它们都会失败。
标签: sql database sql-server-2008 tsql triggers