【问题标题】:Updating Table in Delete Trigger for Multiple Rows Deleted在删除触发器中更新表以删除多行
【发布时间】:2012-01-10 06:38:47
【问题描述】:

我从 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。 谁能帮我解决我做错的事情? 谢谢!

【问题讨论】:

    标签: tsql triggers


    【解决方案1】:

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

     AFTER DELETE
     AS 
     begin
    
        update a set isUsed = 0
        from dbo.warrantyclaimsauth a
        inner join deleted d on a.warrantyAuthNo = d.warrantyAuthNo
    
    
     end
    

    您加入了deleted,其中warrantyauthno 等于自身,而不是deleted 表中的值。你基本上只是在做 cross joindeleted 并且没有过滤任何行。

    【讨论】:

    • 天哪,我真是个笨蛋,我快疯了,一直忽视这一点。谢谢你的愚蠢问题!
    【解决方案2】:
    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
      

      【讨论】:

        猜你喜欢
        • 2015-04-26
        • 1970-01-01
        • 2020-02-02
        • 2021-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        相关资源
        最近更新 更多