我有一张表来计算总扣除额和上个月的剩余扣除额。
剩下的旧月扣除中的任何更新都应该按顺序影响下几个月,所以我为这个表创建了一个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
我正在为具有此触发器的同一个表进行更新但是第一次调用触发器应该再次调用触发器以进行下一次更新,但它没有发生。
我迫切需要知道如何解决它。
由于
答案 0 :(得分:9)
需要注意的一点是:SQL Server触发器每个语句触发 (并且每行一次非一次,许多开发人员认为/假设)
如果该语句更新了多行,那么Inserted
和Deleted
伪表将包含多行 - 因此您的选择就像
SELECT
@NewRemainingToNextMonth = RemainingToNextMonth,
@NewTotalDeduction = TotalDeduction
FROM INSERTED
将失败 - 如果Inserted
中有五十行
您需要重写触发器,以便能够在Inserted
和Deleted
伪表中处理多个正在处理的行...