2013-10-15 30 views
2

我需要一个触发继承人的问题SQL服务器触发

假设主表包含一个名为TotalRental列代表由业主租用的所有单总租赁费帮助。编写代码下面的文本

a.When在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中的问题是,当我插入一行它改变表不只是一个,我想 请解释什么是错,我该如何解决即时通讯使用微软的所有行sql server 2012 谢谢

回答

1

你需要加入到插入的表只选择已插入的行:

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: Use the inserted and deleted Tables

+0

谢谢你不很多想知道过了多久我工作的这个 – user2881301

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