【问题标题】:Update Trigger SQL Server更新触发器 SQL Server
【发布时间】:2014-10-26 17:30:58
【问题描述】:

我有两个表,分别称为 Table_ATable_B。我想创建一个触发器,以便每当 Table_A 中的 payment 字段更新时,应将新记录插入 Table_B 以显示以前的总付款额和现在的总付款额的差额。两张表如下:

Table_A

A_id | payment |
 1   |  1000   |
 2   |   200   |

Table_B

B_id |  difference |

我的触发器实现如下。我不确定如何计算这个差异:

CREATE TRIGGER trigger_Difference
ON Table_A
FOR UPDATE
AS
BEGIN
 DECLARE @Difference as INT
 DECLARE @PreviousDiff as INT

 BEGIN
    SELECT @PreviousDiff = SUM(payment)
    FROM Table_A
 END

 if update(payment)
    BEGIN
        SELECT @Difference = ***don't know what to put here*** 
        FROM inserted

        INSERT INTO Table_B (difference) VALUES (@Difference)
    END
END

【问题讨论】:

  • 提示:添加此付款之前和添加此付款之后的总付款的差异正好等于最近一次付款.
  • 您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器每个语句触发一次,因此如果您的UPDATE 语句影响25 行,您将触发触发器一次,然后Inserted 和@987654327 @ 每个将包含 25 行。您的代码将在这 25 行中选择哪一行:SELECT @Difference = .... FROM Inserted - 这是不确定的。您需要重写触发器以考虑到这一点!

标签: sql sql-server tsql database-trigger


【解决方案1】:

此问题的另一种解决方案是在存储过程中使用 OUTPUT 子句来执行更新或仅根据您的需要调整此方法。

IF OBJECT_ID('TABLE_A') IS NOT NULL DROP TABLE TABLE_A
IF OBJECT_ID('TABLE_B') IS NOT NULL DROP TABLE TABLE_B
IF OBJECT_ID('sp_Payment_Update') IS NOT NULL DROP PROC sp_Payment_Update
GO

CREATE TABLE TABLE_A (
    A_ID INT IDENTITY(1,1),
    Payment INT
)

CREATE TABLE TABLE_B (
    B_ID INT ,
    OldPayment INT,
    NewPayment INT
)
GO

INSERT INTO TABLE_A VALUES (1000),(1200)
GO

CREATE PROC sp_Payment_Update
    @A_ID INT,
    @Payment INT
AS BEGIN

    UPDATE TABLE_A
    SET Payment = @Payment
        OUTPUT
            INSERTED.A_ID,
            DELETED.Payment,
            INSERTED.Payment
        INTO TABLE_B
    WHERE A_ID = @A_ID


    SELECT * FROM TABLE_A
    SELECT * FROM TABLE_B
END
GO

EXEC sp_Payment_Update 1, 1500

更新代码本身将在 TABLE_B 中记录您使用它所做的许多更改,您也可以在 TABLE_B 中放置一个 UpdateDate 列,默认值为 GETDATE () 以使其提供更多信息。

【讨论】:

    猜你喜欢
    • 2011-06-03
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2016-11-03
    • 2014-10-23
    • 2016-03-28
    • 2012-03-13
    相关资源
    最近更新 更多