我有一个名为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
为什么这个触发不起作用?
请帮助
答案 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
但是你应该考虑改变你的逻辑,这样如果日期错误,记录永远不会插入到第一位。