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既存の予約の2つの日付を比較することです。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  

このトリガーが機能しないのはなぜですか?

助けてください

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 に答える