触发以防止重复预订始终出现

时间:2019-05-08 15:56:12

标签: sql sql-server

存在一个问题,即即使我无法确定触发条件,触发条件始终会标记为正。当3个条件与另一个预订完全相同时,我希望它进行标记,但是,每当我使用任何数据运行它时,它似乎都返回假阳性。

CREATE TRIGGER dbo.doubleBookRevised
ON dbo.tblBookingDetailsRevised
AFTER INSERT
AS
IF Exists (SELECT * FROM inserted i JOIN
dbo.tblBookingDetailsRevised bdr
ON i.locationID = bdr.locationID AND
i.bookedFor = bdr.bookedFor AND
i.bookedTimeSlot = bdr.bookedTimeSlot)
BEGIN RAISERROR ('Double bookings are not allowed.', 16, 1)
ROLLBACK TRANSACTION
RETURN
END
GO

我已经在C#前端中实现了一些逻辑以防止重复预订,但是当我运行该程序时,它将在前端验证中成功,但是会标记为误写入尝试写入表。

我曾以此为参考,但无法理解我的实现与此处的解决方案有何不同。 Preventing double bookings in SQL

编辑:根据建议,我将AFTER INSERT到INSTEAD OF INSERT的触发器修改为以下内容;

INSTEAD OF INSERT
AS
IF (NOT Exists (SELECT * FROM inserted i JOIN
dbo.tblBookingDetailsRevised bdr
ON (i.locationID = bdr.locationID) AND
(i.bookedFor = bdr.bookedFor) AND
(i.bookedTimeSlot = bdr.bookedTimeSlot)))
INSERT INTO tblBookingDetailsRevised (bookingID, bookedFor, locationID, bookedTimeSlot, detailEquip) 
SELECT i.bookingID, i.bookedFor, i.locationID, i.bookedTimeSlot, i.detailEquip 
FROM inserted i
ELSE
BEGIN RAISERROR ('Double bookings are not allowed.', 16, 1)
RETURN
END

2 个答案:

答案 0 :(得分:1)

发布的问题可以通过包含3列的简单UNIQUE CONSTRAINT来解决。没有理由重新发明轮子。

ALTER TABLE dbo.tblBookingDetailsRevised 
ADD CONSTRAINT UQ_BookingDetailsRevised UNIQUE (locationID, bookedFor, bookedTimeSlot); 

除非有其他事情发生,并且问题中缺少信息。

答案 1 :(得分:0)

您正在使用AFTER INSERT触发器,这意味着在触发器触发IF EXISTS检查之前插入了该行。由于它在插入的同一事务中,因此您将在最近添加的行上进行匹配,并将获得肯定的结果。如果要在插入之前捕获它,请使用INSTEAD OF INSERT触发器并在触发器内处理该插入。