我有桌位预订:
id_guest |id_room|date_in |day_out |
1 |1 |1/1/2019|1/5/2019|
2 |2 |1/3/2019|1/5/2019|
3 |1 |1/2/2019|1/4/2019| invalid
[id_guest
3无效,因为您无法预订已经出租的房间。
所以我想创建触发器来防止这种情况。
未经测试,但这应该可以让您接近。逻辑非常简单。只是一个简单的碰撞检查。我必须同意评论,但是通常最好将这种类型的“业务规则”作为存储过程的一部分或在应用程序层中进行检查,但是您要求触发器,因此以触发器的形式提供示例逻辑。
CREATE TRIGGER VerifyResDate ON dbo.Reservation
AFTER INSERT
AS
IF EXISTS (
SELECT * FROM dbo.Reservation R
INNER JOIN Inserted I
ON I.room_id = R.room_id AND -- same room
I.user_id <> R.user_id AND -- different user
(I.DateIn <= R.DayOut AND I.DayOut >= DateIn) -- overlap
)
BEGIN
RAISERROR ('Another guest has this room on those dates.', 16, 1);
ROLLBACK TRANSACTION;
RETURN
END;
GO
此外,这仅保护插入。根据您的应用程序的工作方式,某人可以稍后进入并更新现有的保留,并将有效日期更改为原始插入后的无效日期。因此,您可能希望将“更新后”作为触发器的一部分。