存在一个问题,即即使我无法确定触发条件,触发条件始终会标记为正。当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
答案 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
触发器并在触发器内处理该插入。