2

我需要帮助来触发这里的问题

假设 Owner 表包含一个名为 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,谢谢

4

2 回答 2

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子句没有进行任何过滤。如果你是服务员,你会如何阅读你的陈述?更新所有者编号与码头单中所有者编号匹配的所有行。

TechNet:使用插入和删除的表

于 2013-10-15T06:15:17.293 回答
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
于 2013-10-15T06:23:54.410 回答