【问题标题】:Update the same table in the trigger更新触发器中的同一张表
【发布时间】:2012-03-20 09:34:54
【问题描述】:

我有一个表格,可以计算上个月的总扣除额和剩余扣除额。

并且旧月份剩余扣除额中的任何更新都应按顺序影响接下来的几个月,因此我为此表创建了一个AFTER UPDATE触发器,但我注意到@987654322没有调用该触发器@下个月。

检查触发代码

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

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

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

谢谢

【问题讨论】:

  • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法突出显示它!
  • 您能否让我们更好地了解您要完成的工作?看起来您想要在更改的月份之后的所有月份更新 TotalDeduction,但无法从触发器内触发触发器。我问,因为现在写的方式只会在下个月更新,即使为后续更新调用了触发器:唯一改变的字段是 TotalDeduction 和 Visited,并且由于 RemainingToNextMonth 没有改变,后续更新不会有任何变化,除了访问的标志。

标签: sql-server tsql triggers


【解决方案1】:

需要注意的一点:SQL Server 触发器每条语句触发一次(并且不会像许多开发人员认为/假设的那样每行触发一次)

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多