我有两个具有以下结构的表dbo.booking
和dbo.seat
:
-
dbo.booking
具有列noBooking, noSeat, start, [end], statusBooked
-
dbo.seat
具有列noSeat, statusSeat
我插入到dbo.booking
的每一行数据(statusBooked
值设置为1),然后在dbo.seat
列上statusSeat
(默认为0)将更新为1。
如果statusBooked
被更新为0,则statusSeat
也将更新为0。
我的意思是statusSeat
(默认为0)将更新并遵循statusBooked
值。
我试着使用一个触发器:
ALTER TRIGGER [dbo].[TriggerUpdateSeat]
ON [dbo].[booking]
AFTER INSERT, UPDATE
AS
UPDATE dbo.seat
SET seat.statusSeat = i.statusBooked
FROM Inserted i
WHERE dbo.seat.noSeat = i.noSeat;
但问题是,当我第一次在dbo.booking
上插入数据时,dbo.seat
填充的statusSeat
必须更新为1,但它没有更新为1——它不起作用。但对于第二个和第二个前锋来说,这是有效的。CCD_ 18值在CCD_ 19值之后。
这个问题只有在我第一次运行程序并插入数据时才会发生。
为什么?
假设您想在Booking中查看数据,并在Seat中查看匹配的数据。你可以通过加入来做到这一点。
select b.*, s.*
from Booking b
join Seat s
on s.noSeat = b.noSeat;
但您希望将结果集限制在座位状态值不同的地方。
select s.*, b.*
from Seat s
join Booking b
on b.noSeat = s.noSeat
and b.statusBooked <> s.statusSeat;
现在把它变成一个update
语句。但同时,这是在触发器内部,所以它实际上不是你使用的预订。
update s
set s.statusSeat = b.statusBooked
from Seat s
join Inserted b
on b.noSeat = s.noSeat
and b.statusBooked <> s.statusSeat;
如果我是对的,这将解决您的问题。如果statusBooked
已更新,则您的statusSeat
列将更新为statusBooked
列。如果statusBooked
Inserted和statusBooked
大于0(因为默认为0),则您的statusSeat
列将更新为statusBooked
列。
ALTER TRIGGER [dbo].[TriggerUpdateSeat]
ON [dbo].[booking]
AFTER INSERT, UPDATE
AS
IF UPDATE (statusBooked)
BEGIN
UPDATE dbo.seat
SET seat.statusSeat = i.statusBooked
FROM Inserted i
WHERE dbo.seat.noSeat = i.noSeat;
END
ELSE
BEGIN
UPDATE dbo.seat
SET seat.statusSeat = i.statusBooked
FROM Inserted i
WHERE dbo.seat.noSeat = i.noSeat and i.statusBooked>0;
END