SQL Server 2008触发器不起作用,为什么?

时间:2013-02-22 12:10:13

标签: sql-server-2008 tsql triggers

我有一个名为tblReservations的表,其中包含以下列:

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

应该在start_date针对特定end_date比较新预订的tblReservationaptID的现有预订。

如果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 aptID=@aptID

        if @end_date>@start_date
        BEGIN
            ROLLBACK TRANSACTION
        END
    end  

为什么这个触发不起作用?

请帮助

2 个答案:

答案 0 :(得分:1)

除了其他人提出的多方面问题之外,你可能不会考虑tblReservations中有很多行用于特定的apt。

另外,你不想插入记录然后摆脱它,你希望记录不进入。因此,而不是触发是更好的选择。

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  

答案 1 :(得分: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

但是你应该考虑改变你的逻辑,这样如果日期错误,记录永远不会插入到第一位。