Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否在SQL Server中创建触发器以检查是否在同一天?_Sql Server_Triggers - Fatal编程技术网

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

Sql server 是否在SQL Server中创建触发器以检查是否在同一天?,sql-server,triggers,Sql Server,Triggers,我预订了一张桌子: 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无效,因为您无法预订已出租的房间 所以我想创建一个触发器来防止这种情况。未经测试,但这应该可以让您接近。逻辑相当简单。只是一个简单的碰撞检查。我必

我预订了一张桌子:

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

此外,这仅保护插入件。根据应用程序的工作方式,可能会有人稍后进来更新现有预订,并在原始插入后将有效日期更改为无效日期。因此,您可能希望将更新后的内容作为触发器的一部分。

未经测试,但这会让您接近。逻辑相当简单。只是一个简单的碰撞检查。我必须同意这一评论,但通常最好在存储过程中或在应用层中检查此类业务规则,但您要求使用触发器,因此以触发器的形式提供示例逻辑

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

此外,这仅保护插入件。根据应用程序的工作方式,可能会有人稍后进来更新现有预订,并在原始插入后将有效日期更改为无效日期。因此,您可能希望将更新后的内容作为触发器的一部分。

假设您仍然需要触发器,我建议您先阅读,然后尝试编写触发器,然后在遇到问题时提出问题。@DaleK在触发器旁边,您是否有其他方法来执行此操作?我想这可能是一个常见问题?我可能会创建一个存储过程来插入到该表中,作为存储过程的一部分,检查预订是否仍然有效以继续进行,在这段时间内保持表锁定,以便在检查预订是否有效和插入预订之间不会发生任何变化。这允许您以更干净的方式处理故障。但是我想触发器会起作用。如何最好地处理这种形式的并发是一个相当复杂的挑战,需要进行大量的研究。假设您仍然需要触发器,我建议您阅读并尝试编写触发器,当你被卡住的时候,再问一个问题。@DaleK在扳机旁边。那么你有其他的方法吗?我想这可能是一个常见的问题?我可能会创建一个存储过程来插入到该表中,作为存储过程的一部分,检查预订是否仍然有效以继续进行,在这段时间内保持表锁定,以便在检查预订是否有效和插入预订之间不会发生任何变化。这允许您以更干净的方式处理故障。但是我想触发器会起作用。如何最好地处理这种形式的并发是一个相当复杂的挑战,需要进行大量的研究。插入后意味着新行已经在表中了。它们会相互重叠。此外,您的重叠检查过于复杂-如果第一个周期在第二个周期结束之前开始,第二个周期在第一个周期结束之前开始,那么两个周期会重叠。您不必分解成各种不同的情况。@rTomas现在我无法插入任何内容,包括满足上述条件的内容。即使我已编写了“DROP TRIGGER IF EXISTS Reservation.VerifyResDate”,我仍然无法插入任何内容Reservation@Damien_The_Unbeliever-对插入后的行为的良好调用,需要在不同的用户上附加一个条件。@Damien_不信者-同样,聪明的重叠逻辑-duh@TuyếnNguyễNị - 检查您在拖放中使用的架构名称-您可以直接拖放-您不需要if exists-这还会显示一条错误消息,告诉您是否使用了错误的名称。AFTER INSERT表示新行已在表中。它们会相互重叠。此外,您的重叠检查过于复杂-如果第一个周期在第二个周期结束之前开始,第二个周期在第一个周期结束之前开始,那么两个周期会重叠。您不必分解成各种不同的情况。@rTomas现在我无法插入任何内容,包括满足上述条件的内容。即使我已编写了“DROP TRIGGER IF EXISTS Reservation.VerifyResDate”,我仍然无法插入任何内容Reservation@Damien_The_Unbeliever-对插入后的行为的良好调用,需要在不同的用户上附加一个条件。@Damien_不信者-同样,聪明的重叠逻辑-duh@TuyếnNguyễNị - 检查您在drop中使用的架构名称-您可以直接drop-您不需要if exists-这还会显示一条错误消息,告诉您是否使用了错误的名称。