1

我有一个名为tblReservations以下列的表:

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

什么触发器应该是比较两个日期start_date的新预订和end_date现有预订tblReservation的特定日期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 aptID=@aptID

        if @end_date>@start_date
        BEGIN
            ROLLBACK TRANSACTION
        END
    end  

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

请帮忙

4

2 回答 2

1

除了其他人提出的 multiorw 问题之外,您可能没有考虑到特定 apt id 的 tblReservations 中有很多行。

另外,您不想插入记录然后删除它,您希望记录不进入。因此,而不是触发器是更好的选择。

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  
于 2013-02-22T15:41:58.493 回答
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

但是您应该考虑更改您的逻辑,以便在日期错误时永远不会插入记录。

于 2013-02-22T12:37:15.057 回答