2014-10-26 179 views
1

我有兩個表叫它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

回答

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 

更新代碼本身將記錄你與它表-B發生了許多變化,你也可以把UpdateDate列表-BGETDATE的默認值(),使其更加翔實。