tsql - 在删除触发器中更新表以删除多行

标签 tsql triggers

我从 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。 谁能帮我解决我做错了什么? 谢谢!

最佳答案

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

 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 表中的值。您实际上只是在对 deleted 进行 cross join,而没有过滤任何行。

关于tsql - 在删除触发器中更新表以删除多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8796135/

相关文章:

sql - 使用oracle触发器更新条件已存在的第二个表

MySQL 老化触发器

sql-server - 插入触发器后更新SQL Server HierarchyId

sql-server-2005 - 如何在SQL Server触发器中获取更新的列的列表?

sql-server - SQL - HAVING 子句中的聚合

sql - SQL 语句中的动态别名

tsql - 在存储过程中更新之前验证记录

tsql - SQL中获取两个值中的最小值

sql - 无法使我的存储过程 IF 语句工作

javascript - 我按下下键时可以触发另一个键吗?