SQL Server删除触发器不更新表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server删除触发器不更新表相关的知识,希望对你有一定的参考价值。

我还在学习SQL,而且我遇到触发器问题。

我有以下代码:

CREATE TRIGGER DeleteYTDSales
ON dbo.Sales
AFTER DELETE
AS
BEGIN
    UPDATE MasterTable
    SET MasterTable.SalesYTD = MasterTable.SalesYTD - Deleted.Amount
    FROM Sales
    JOIN Deleted ON Sales.CustomerID = Deleted.CustomerID 
END
GO

从sales表中删除一行后,我需要更新SalesYTDCustomerIDMasterTable列。现在它没有更新列,我无法弄清楚为什么不。

答案

因为你缺少MasterTable的连接条件。你正在寻找这个

UPDATE m
    SET m.SalesYTD = m.SalesYTD - d.Amount
    FROM MasterTable m
    JOIN Deleted d ON d.CustomerID = m.CustomerID 
另一答案

你的更新真的很奇怪。我想你只是打算:

UPDATE mt
  SET SalesYTD = mt.SalesYTD - d.Amount
  FROM MasterTable mt JOIN
       Deleted d
       ON mt.CustomerID = d.CustomerID ;

在您的代码中,您正在更新MasterTable的所有行。使用UPDATEs SQL Server可能有点棘手。我的建议是使用FROM子句并始终将别名放在UPDATE中。

您不需要参考Sales表,因为您需要的所有信息都在deleted中。

你也可以这样写:

UPDATE MasterTable
  SET SalesYTD = mt.SalesYTD - d.Amount
  FROM Deleted d
  WHERE MasterTable.CustomerID = d.CustomerID ;

以上是关于SQL Server删除触发器不更新表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 使用表触发器记录表插入,更新,删除行数

Sql Server 2005 - 插入更新触发器 - 获取更新,插入行

如何在 SQL Server 触发器中复制插入、更新、删除的行

SQL Server2008 触发器中,根据一个表修改另外一个表

在 SQL Server 2008 R2 中为每个表创建创建触发器

SQL Server 触发器