2014-10-26 2 views
1

У меня есть две таблицы, назовите его Таблица_A и Таблица_B. Я хочу, чтобы создать триггер таким образом, что всякий раз, когда поле payment в TABLE_A обновляется новая запись должна быть вставлена ​​в TABLE_B, чтобы показать разницу в размерах всех платежей до и общих платежей в настоящее время. Две таблицы ниже:Обновление Trigger SQL Server

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

Подсказка: разница в общей сумме платежей * до * добавление этого платежа и * после * добавление этого платежа равно ровно одному платежу, самому последнему. –

+5

У вашего триггера есть ** ОСНОВНАЯ ** ошибка в том, что вы, кажется, считаете, что она будет называться ** один раз в строке ** - это не **, а не случай. Триггер будет срабатывать ** один раз за оператор **, поэтому, если ваши утверждения 'UPDATE' влияют на 25 строк, вы будете запускать триггер ** сразу **, но тогда' Inserted' и 'Deleted' будут содержать 25 строк , Какой из этих 25 строк ваш код выберет здесь: 'SELECT @Difference = .... FROM Inserted' - он не детерминирован. Для этого нужно переписать триггер! –

ответ

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 также вы можете поставить колонки UpdateDate в TABLE_B со значением по умолчанию GETDATE(), чтобы сделать его более информативным ,