2013-02-22 33 views
1

我有一个名为tblReservations与follwing列的表:SQL Server 2008触发器不起作用,为什么?

reserv_ID (int), aptID (int), client_ID (int), 
start_date (datetime), end_date (datetime), 
details (nvarchar(max)), confirmation (bit) 

应该是什么触发比较两个日期start_date新的预订和end_datetblReservation特定aptID现有的预订。

如果start_date < end_date触发器必须阻止为该aptID插入新保留。

我写这个触发器:

CREATE TRIGGER NewReservation 
    on tblReservations 
    after insert 
    as 
    begin 
     declare @aptID int 
     declare @start_date datetime 
     declare @end_date datetime 

     select @aptID=aptID, @start_date=start_date from inserted 
     select @end_date=end_date from tblReservations 
     where [email protected] 

     if @end_date>@start_date 
     BEGIN 
      ROLLBACK TRANSACTION 
     END 
    end 

为什么这个触发不行?

请帮忙

+2

难道你不能只使用检查约束'CHECK(start_date <= end_date)'? – 2013-02-22 13:37:38

+0

任何触发器wirtten在其中您将插入或删除的值设置为标量变量是错误的。它不会正确处理多行插入,更新或删除。你永远不能认为这些不会发生。 – HLGEM 2013-02-22 15:28:50

+0

除了多行处理问题,您可能不会考虑tblReservations中有许多行针对特定的apt ID。 – HLGEM 2013-02-22 15:30:40

回答

0

我看到的第一个问题是你假设插入是单行。

尝试:

Select top 1 @aptID=bb.aptID, @start_date=start_date 
from inserted as aa 
join 
(
    select Max(start_date) as Start_Date from inserted 
) as bb 
on aa.Start_Date =bb.Start_Date 

但是,你应该想想,这样的记录永远不会被插入在首位,如果日期是错误的改变你的逻辑。

+0

准确地说 - 一个触发器可能会被调用一次用于多个INSERT,因此Inserted会包含多行... – 2013-02-22 12:40:43

+1

对于多行插入,这仍然无法正确工作。如果你曾经从触发器内的'inserted'分配标量变量,那么它可能会被破坏。 – 2013-02-22 13:45:52

1

除了其他人提出的multiorw问题,您可能不会考虑tblReservations中有许多行针对特定的apt ID。

加上你不想插入记录,然后摆脱它,你想记录不进去。因此,一个而不是触发是一个更好的选择。

CREATE TRIGGER NewReservation 
    ON tblReservations 
    INSTEAD OF INSERT 
    AS 
    BEGIN 

     INSERT tblReservations (<put field list here>) 
     SELECT <put field list here> 
     FROM inserted i 
     JOIN (SELECT aptid, MAX(reservationid)AS reservationid FROM tblReservations GROUP BY aptid) maxid 
      ON i.aptid = r.aptid 
     JOIN tblReservations r 
      ON r.reservationid = maxid.reservationid 
     WHERE r.enddate<i.startdate 


    END 
+0

好吧,但现在我得到这个错误:消息4104,级别16,状态1,过程NewReservation,行15 无法绑定多部分标识符“r.aptid”。 – user2099269 2013-02-22 17:49:26

+0

这是因为我在写它时错过了一个引用而改变了别名。 r.aptid应该是maxid.aptid – HLGEM 2013-02-22 18:00:40

+0

谢谢,它现在可以工作,你很棒 – user2099269 2013-02-22 18:16:56