2012-01-09 81 views
3

我在SqlServer的开始与下面的触发器2000更新表中删除

ALTER TRIGGER DeleteTrigger 
ON [dbo].[WarrantyClaimsLineItems] 
FOR DELETE 
AS 
begin 

    declare @wa int 
    SET @wa = (SELECT warrantyAuthNo from DELETED) 
    update dbo.warrantyclaimsauth 
    set isused = 0 
    WHERE warrantyClaimsAuth.warrantyauthno = @wa 


end 

基本上,只要行项目从表中删除我需要更新已分配的warrantyauth.isUsed将该订单项恢复为false。

它适用于删除一个行项目但删除多个行项目时出现以下错误。

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

我明白为什么,触发器期望只有一条记录被删除。 所以我需要修改它来处理多行删除。

我做了一些研究,并修改了我的触发是这个

.... 
AFTER DELETE 
AS 
begin 

    update dbo.warrantyclaimsauth set isUsed = 0 
    from dbo.warrantyclaimsauth a 
    inner join deleted d on a.warrantyAuthNo = a.warrantyAuthNo 


end 

然而,这在isUsed领域更新的warrantyclaimsauth每一行与0。 任何人都可以帮助我做我做错了什么? 谢谢!

回答

4

您的加入条件在第二个中是错误的。试试这个:

AFTER DELETE 
AS 
begin 

    update a set isUsed = 0 
    from dbo.warrantyclaimsauth a 
    inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo 


end 

你加入了其中deletedwarrantyauthno等于本身,而不是从deleted表中的值。你基本上只是在做的cross join,而不是过滤任何行。

+1

噢,我的我是这样一个白痴,我是疯了,不断俯视。非常抱歉,愚蠢的问题! – twaldron 2012-01-09 22:40:28

3
inner join deleted d on a.warrantyAuthNo = a.warrantyAuthNo 

应该

inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo 

您现在有一个简单的连接条件给人一种交叉连接不过滤到deleted

3
.... 
 AFTER DELETE 
 AS 
 begin 

    update dbo.warrantyclaimsauth set isUsed = 0 
    from dbo.warrantyclaimsauth a 
    inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo 


 end