SQL服务器触发器

时间:2013-10-15 05:57:35

标签: sql sql-server

我需要帮助才能触发问题

假设所有者表包含一个名为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 感谢

2 个答案:

答案 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中所有者编号匹配的所有行。

TechNet: Use the inserted and deleted Tables

答案 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
相关问题