我需要帮助才能触发问题
假设所有者表包含一个名为TotalRental的列,该列表示该所有者租用的所有单据的总租赁费用。按照文本
中显示的样式编写以下触发器的代码a。在MarinaSlip表中插入一行时,将租金加到适当所有者的总租金中
继承我的sql
CREATE TRIGGER add_rentalfee
ON MarinaSlip
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE Owner
SET TotalRental = TotalRental + RentalFee
FROM Owner INNER JOIN MarinaSlip ON Owner.OwnerNum = MarinaSlip.OwnerNum
WHERE owner.OwnerNum = MarinaSlip.OwnerNum
END
GO
你可以告诉我新的sql问题是,当我插入一行时,它改变了表中的所有行而不仅仅是我想要的那一行 请解释什么是错的,我怎么能解决它我使用microsoft sql server 2012 感谢
答案 0 :(得分:1)
您需要加入INSERTED表以仅选择已插入的行:
CREATE TRIGGER add_rentalfee
ON MarinaSlip
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE Owner
SET TotalRental = TotalRental + RentalFee
FROM Owner INNER JOIN MarinaSlip ON Owner.OwnerNum = MarinaSlip.OwnerNum
INNER JOIN INSERTED ON owner.OwnerNum = INSERTED.OwnerNum
END
GO
如果您仔细检查SELECT
语句,INNER JOIN
将两个表链接在一起,但您的WHERE
子句没有进行任何过滤。如果您是服务器,您会如何阅读您的陈述?更新所有者编号与marina slip中所有者编号匹配的所有行。
答案 1 :(得分:0)
您应该使用INSERTED表,并确保您的查询可以处理一次插入的多行:
UPDATE Owner
SET TotalRental = TotalRental + insT.SumRentalFee
FROM Owner
INNER JOIN
(select OwnerNum, sum(RentalFee) as SumRentalFee
from INSERTED
group by OwnerNum) as insT
ON Owner.OwnerNum = insT.OwnerNum