如何在 MS SQL 2008 中使用触发器更新单个表

Posted

技术标签:

【中文标题】如何在 MS SQL 2008 中使用触发器更新单个表【英文标题】:How to update a single table using trigger in MS SQL 2008 【发布时间】:2010-05-04 08:12:10 【问题描述】:

我有一个 PeroidicDeduction 表,字段是 ID(自增),TotalDeduction(例如可以是贷款),Paid(每月扣除),RemainingAmount,

我想要的是每次插入或更新表格时---RemainingAmount 将获得 TotalDeduction-SUM(Paid) 的值...并编写以下触发器...但对我不起作用

创建触发器 dbo.UpdatePD ON PeroidicDecution 插入后,更新

作为

开始

UPDATE PeroidicDecution SET REmaininAmoubnt=(SELECT TotalDeduction-(SELECT SUM(Paid) FROM PeroidicDeduction) FROM PeroidicDeduction)

结束

注意:它在一张桌子上

【问题讨论】:

你的意思是单身 - 在同一张桌子内 是的,我想在一个表中完成任务 【参考方案1】:

创建两个触发器,一个 INSTEAD OF UPDATE 和一个 INSTEAD OF INSERT。这是 INSTEAD OF UPDATE 的代码:

CREATE TRIGGER dbo.UpdatePD ON PeroidicDedcution 
INSTEAD OF Update
AS
SET NOCOUNT ON

UPDATE p
    SET col1=i.col1
       ,col2=i.col2
    FROM INSERTED  i
        INNER JOIN PeroidicDedcution p ON i.PK=p.PK

UPDATE PeroidicDedcution 
    SET REmaininAmoubnt=(SELECT TotalDeduction-(SELECT SUM(Paid) FROM PeroidicDeduction) FROM PeroidicDeduction)
go

它将执行触发触发器的原始更新,以及问题中触发器的 SUM 逻辑。

这里是 INSTEAD OF INSERT 触发器:

CREATE TRIGGER dbo.InsertPD ON PeroidicDedcution 
INSTEAD OF INSERT
AS
SET NOCOUNT ON

INSERT INTO PeroidicDedcution
    (col1, col2, ...)
    SELECT
       col1, col2, ...
    FROM INSERTED

UPDATE PeroidicDedcution 
    SET REmaininAmoubnt=(SELECT TotalDeduction-(SELECT SUM(Paid) FROM PeroidicDeduction) FROM PeroidicDeduction)
go

【讨论】:

【参考方案2】:

您不应该使用触发器来执行此操作,因为如果您在表上有更新触发器并且触发器导致并更新到同一个表,它将递归地自行触发。而是将逻辑添加到您的插入和更新存储过程中

【讨论】:

以上是关于如何在 MS SQL 2008 中使用触发器更新单个表的主要内容,如果未能解决你的问题,请参考以下文章

如何:使用 SQL Server 2008 为自动更新修改日期创建触发器

更新触发器 SQL Server 2008

在SQL2008中我要创建个更新(UPDATE)触发器

如何将一个触发器写入 SQL Server 2008 的所有表

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

如何找到 MS SQL Server 2008 的端口?