2017-05-31 61 views
1

你好,为了业余爱好的目的,我试图用MS SQL Server数据库创建一个C#应用程序,它重新组合一个酒店系统。我现在正试图创建一个SQL触发器,它可以计算一个过期的差异。预订时间不得超过6周(42天)。然而,即使差异为1天,即使预订时间差低于42天,我的触发也会消失。所以我不确定我做错了什么。触发器计数datediff

我的触发器:

create trigger trigger_reservation 
on reservation 
after update, insert 
as 
if exists 
(
select reservationid, DATEDIFF(dd,Startdate,Enddate) 
from reservation 
group by reservationid, enddate, startdate 
having DATEDIFF(dd,Startdate,Enddate) > 42 
) 
begin 
    raiserror('Error: Reservation may not be longer than 6 weeks',16, 1) 
    rollback transaction 
end 
+0

当然你的触发器正在检查整个表,而不仅仅是你插入的行?如果您在数据表中已经有超过42天的预留,那么触发器将始终激活。 –

+0

你是对的,确实有一些超过42天的预留(随机生成的数据)。我将如何解决这个问题? – glnxhjeh

+0

基本上,您需要知道您在触发器中可以访问的“特殊”表格,您希望在此处“插入”的表格。我看到peterm已经更新了他的答案,并且它应该按照您的要求工作...... –

回答

3

触发器是运行和维护成本。这种类型的检查可以通过简单的CHECK CONSTRAINT

CREATE TABLE reservation (
    reservationid INT, 
    startdate DATE, 
    enddate DATE, 
    -- ... 
    CONSTRAINT reservation_dates_ck 
    CHECK(DATEDIFF(dd, startdate, enddate) < 43) 
) 

这里完成是dbfiddle演示

而且这里是你如何去与触发器

CREATE TRIGGER trigger_reservation 
ON reservation AFTER UPDATE, INSERT 
AS 
    IF EXISTS (
    SELECT * 
     FROM inserted 
    WHERE DATEDIFF(dd, startdate, enddate) > 42 
) 
    BEGIN 
    RAISERROR ('Error: Reservation may not be longer than 6 weeks', 16, 1); 
    ROLLBACK TRANSACTION; 
    RETURN 
END; 

这里做是dbfiddle演示

+0

感谢您的回复。我知道检查,但为了测试的目的,我真的希望它成为触发器。 – glnxhjeh

+0

查看已更新的答案 – peterm

+0

检查约束是解决这个问题的最好方法。在这里使用触发器有点像在基于集合的解决方案可用时使用游标。 –