更新触发器中的同一个表

时间:2012-03-20 09:34:54

标签: sql-server tsql triggers

我有一张表来计算总扣除额和上个月的剩余扣除额。

剩下的旧月扣除中的任何更新都应该按顺序影响下几个月,所以我为这个表创建了一个AFTER UPDATE触发器,但我注意到触发器没有被调用UPDATE下个月。

检查触发代码

CREATE TRIGGER [dbo].[tgUpdateRemainingBalance]
ON [dbo].[GAT_MONTHLY_DEDUCTION] 
AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;

DECLARE @OldTotalDeduction INT 
DECLARE @NewTotalDeduction INT
DECLARE @OldRemainingToNextMonth INT
DECLARE @NewRemainingToNextMonth INT

SELECT @OldRemainingToNextMonth = RemainingToNextMonth,
@OldTotalDeduction = TotalDeduction
FROM DELETED

SELECT @NewRemainingToNextMonth = RemainingToNextMonth,
@NewTotalDeduction = TotalDeduction
FROM INSERTED

DECLARE @EmpNo BIGINT
DECLARE @RegDate DATETIME

SELECT @EmpNo = PersonnelNo, @RegDate = RegDate FROM INSERTED

IF (@OldRemainingToNextMonth <> @NewRemainingToNextMonth) OR (@OldTotalDeduction <> @NewTotalDeduction)
BEGIN
UPDATE GAT_MONTHLY_DEDUCTION
SET TotalDeduction = TotalDeduction - @OldRemainingToNextMonth + @NewRemainingToNextMonth,
Visited = 1
WHERE RegDate = DATEADD(month, 1, @RegDate) AND PersonnelNo = @EmpNo
END
END

我正在为具有此触发器的同一个表进行更新但是第一次调用触发器应该再次调用触发器以进行下一次更新,但它没有发生。

我迫切需要知道如何解决它。

由于

1 个答案:

答案 0 :(得分:9)

需要注意的一点是:SQL Server触发器每个语句触发 (并且每行一次一次,许多开发人员认为/假设)

如果该语句更新了多行,那么InsertedDeleted伪表将包含多行 - 因此您的选择就像

SELECT 
    @NewRemainingToNextMonth = RemainingToNextMonth,
    @NewTotalDeduction = TotalDeduction
FROM INSERTED

将失败 - 如果Inserted中有五十行

,则应选择哪一行

您需要重写触发器,以便能够在InsertedDeleted伪表中处理多个正在处理的行...