2014-04-01 3 views
0

Быстрый вопрос: у нас есть простой триггер, который мы должны использовать, чтобы вставить в TableB, например, если обновить 3 столбца (Позволяет называть их c1, c2 или c3).SQL Server Trigger on Update (только новые данные)

Однако я видел примеры триггеров, которые делают это, но я НЕ хочу, чтобы он вставлялся, если c1, c2 или c3 обновляются с той же информацией. Это может быть только новая информация.

Я знаю, что есть «после обновления», но эта работа, если же данные помещаются в колоннах (Потому что если это так, я не хочу этого)

+0

В триггер UPDATE вы имеете доступ к старым данным в удалённых и новых данных в INSERTED. Добавьте логику для сравнения значений совпадающих записей и выполняйте только INSERT, если они разные. –

+0

Итак, вы говорите, что только триггер должен вставлять данные в таблицу B, если вставляются новые данные, или данные, которые отличаются от существующих данных в C1,2 или 3, обновляются? Если данные обновления совпадают с теми, что уже есть в C1,2 и 3, пропустите вставку в таблицу B? – John

+0

Правильно, я хочу только вставить данные в таблицу B, если столбцы C1, C2 или C3 обновлены новыми данными, а не теми же данными. –

ответ

0

Вы можете использовать INSTEAD OF UPDATE курок. Это позволит вам увидеть значения, которые были до обновления, и то, что обновляется.

CREATE TRIGGER dbo.InsteadOfUpdateMyTable ON dbo.MyTable 
    INSTEAD OF UPDATE 
AS 
    BEGIN 
     INSERT INTO SomeOtherTable 
       (col1 
       ,col2 
       ,col3 
       ) 
       SELECT i.col1 
         ,i.col2 
         ,i.col3 
        FROM INSERTED i 
        JOIN MyTable s 
         ON i.id = s.id 
          AND (i.col1 <> s.col1 
           OR i.col2 <> s.col2 
           OR i.col3 <> s.col3 
           ) 
     UPDATE t 
      SET t.col1 = i.col1 
       ,T.col2 = i.col2 
       ,T.col3 = i.col3 
      FROM MyTable t 
      JOIN INSERTED i 
       ON i.id = t.id 
    END 

здесь SQL Скрипки http://sqlfiddle.com/#!6/a249a/6