更新触发器SQL Server

更新触发器SQL Server

问题描述:

我有两个表叫它Table_ATable_B。我想创建一个触发器,使得每当表-Apayment字段更新的新纪录应该插入表-B显示之前支付的价款和总支付量之差了。这两个表都低于:更新触发器SQL Server

表-A

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

表-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 
+1

提示:*在添加此付款之前的总付款金额*与*添加此付款金额之间的差额等于恰好一次付款,即最近一次付款。 – 2014-10-26 17:35:05

+5

你的触发器有** MAJOR **缺陷,你似乎认为它会被称为每行**一次** - 这是**不是**的情况。触发器将在每个语句**中触发一次**,所以如果你的UPDATE语句影响了25行,你将触发**触发**一次,但是,然后“插入”和“删除”将分别包含25行。您的代码在这25行中选择哪一个:SELECT @Difference = .... FROM插入 - 它是非确定性的。你需要重写你的触发器来考虑这个问题! – 2014-10-26 17:44:16

此问题的另一个解决方案是使用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 

更新代码本身将记录你与它表-B发生了许多变化,你也可以把UpdateDate列表-BGETDATE的默认值(),使其更加翔实。