更新触发器中的同一个表

Fou*_*ali 2 t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

mar*_*c_s 9

有一点需要注意:在SQL Server触发器被触发每一次声明(和不是每行一次因为许多开发商认为/假设)

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

SELECT 
    @NewRemainingToNextMonth = RemainingToNextMonth,
    @NewTotalDeduction = TotalDeduction
FROM INSERTED
Run Code Online (Sandbox Code Playgroud)

将失败 - 应该选择哪一行,如果有五十个Inserted

你需要重写你的触发器能够处理多行同时被处理,在InsertedDeleted伪表...