Триггер, чтобы избежать двойных бронирований - PullRequest
0 голосов
/ 08 мая 2019

Проблема, при которой триггер всегда отмечается положительным, хотя, насколько я могу судить, его условия не выполняются.Я хочу, чтобы он отмечался, когда 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 #интерфейс, чтобы предотвратить двойное бронирование, но когда я запустил программу, она успешно прошла проверку, но пометил ложное срабатывание при попытке записи в таблицу.

Я использовал это для справки, но могу 'Я не понимаю, что отличается от моей реализации, чем решение здесь. Предотвращение двойных бронирований в SQL

РЕДАКТИРОВАТЬ: Следуя совету, я исправил триггер из ПОСЛЕ ВСТАВКИ для ВМЕСТО ВСТАВКИ в следующее:

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 ]

1 голос
/ 08 мая 2019

Проблема в том виде, в каком она была опубликована, может быть решена с помощью простого УНИКАЛЬНОГО ОГРАНИЧЕНИЯ, включающего 3 столбца.Нет причин изобретать велосипед.

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

Если не происходит что-то еще и информация отсутствует в вопросе.

0 голосов
/ 08 мая 2019

Вы используете триггер AFTER INSERT, что означает, что строка вставлена ​​до того, как в триггере сработает проверка IF EXISTS. Поскольку он находится в той же транзакции, что и вставка, то вы будете сопоставлять недавно добавленную строку и получите положительный результат. Если вы хотите перехватить его перед вставкой, используйте триггер INSTEAD OF INSERT и обработайте вставку внутри триггера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...