创建触发器以检查SQL Server是否在同一天?

问题描述 投票:0回答:1

我有桌位预订:

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无效,因为您无法预订已经出租的房间。

所以我想创建触发器来防止这种情况。

sql-server triggers
1个回答
0
投票

未经测试,但这应该可以让您接近。逻辑非常简单。只是一个简单的碰撞检查。我必须同意评论,但是通常最好将这种类型的“业务规则”作为存储过程的一部分或在应用程序层中进行检查,但是您要求触发器,因此以触发器的形式提供示例逻辑。

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

此外,这仅保护插入。根据您的应用程序的工作方式,某人可以稍后进入并更新现有的保留,并将有效日期更改为原始插入后的无效日期。因此,您可能希望将“更新后”作为触发器的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.