Sql server 2008 SQL Server 2008触发器不工作,为什么?
我有一个名为tblReservations的表,表中有以下列:Sql server 2008 SQL Server 2008触发器不工作,为什么?,sql-server-2008,tsql,triggers,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) 触发器应该是在tblReservation中针对特定aptID比较新预订的开始日期和现有预订的结束日期 如果开始日期
reserv_ID (int), aptID (int), client_ID (int),
start_date (datetime), end_date (datetime),
details (nvarchar(max)), confirmation (bit)
触发器应该是在tblReservation中针对特定aptID比较新预订的开始日期和现有预订的结束日期
如果开始日期<结束日期,则触发器必须阻止插入该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
为什么这个触发器不起作用
请帮助我看到的第一个问题是您假设插入的是一行 尝试:
但是,您应该考虑更改逻辑,以便在日期错误的情况下,不会在第一个位置插入记录。我看到的第一个问题是您假设插入的是一行 尝试:
但是,您应该考虑更改逻辑,以便在日期错误的情况下永远不会插入记录。除了其他人提出的多行或多行问题之外,您可能没有考虑到特定apt id的TBLR保留中有许多行 另外,您不希望插入该记录然后将其删除,您希望该记录不会进入。因此,用触发器代替触发器是更好的选择
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
除了其他人提出的multiorw问题外,您可能没有考虑到对于特定的apt id,tblreservation中有许多行 另外,您不希望插入该记录然后将其删除,您希望该记录不会进入。因此,用触发器代替触发器是更好的选择
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完全正确-触发器可能会为多行插入调用一次,因此插入将包含多行…这对于多行插入仍然无法正常工作。如果从触发器中插入的变量分配给标量变量,它可能会被破坏。+1确切地说-一个触发器可能会被多次插入调用一次,因此插入的变量将包含多行…这对于多行插入仍然无法正常工作。如果从插入的触发器中为标量变量赋值,它可能已损坏。您不能仅使用检查约束检查开始日期将插入或删除的值设置为标量变量的任何触发器wirten都是错误的。它将无法正确处理多行插入、更新或删除。您永远不能假设这些不会发生。除了多行问题之外,您可能没有考虑到特定apt id的tblReservations中有许多行。您不能只使用检查约束检查开始日期将值从inserted或deleted设置为标量变量的任何触发器wirtten都是错误的。它将无法正确处理多行插入、更新或删除。您永远不能假设这些不会发生。除了多行问题之外,您可能没有考虑到特定apt id的TBLReservation中有许多行。好的,但现在我得到了这个错误:Msg 4104,级别16,状态1,过程NewReservation,第15行无法绑定多部分标识符r.apid。这是因为我在编写别名时更改了别名,并且错过了引用。r、 aptid应该是maxid.aptidok,但现在我得到了这个错误:Msg 4104,级别16,状态1,过程NewReservation,第15行多部分标识符r.aptid无法绑定。这是因为我在编写别名时更改了别名,错过了引用。r、 aptid应该是maxid.aptid