Как использовать триггер обновления для обновления другой таблицы? - PullRequest
20 голосов
/ 10 марта 2011

Я новичок в триггерах и хочу создать триггер для обновления столбца и обновить другую таблицу с этим значением.

У меня есть table1 со столбцом года, и если приложение обновляет этот столбец года IНеобходимо обновить таблицу 2 с годом того же года.

ALTER TRIGGER [dbo].[trig_UpdateAnnualYear]
   ON  [dbo].[table1]
   AFTER UPDATE
AS 

if (UPDATE (intAnnualYear))   
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here

    Update table2 set AnnualYear = intAnnualYear where table2.ID = table1.ID
END

Ответы [ 4 ]

24 голосов
/ 10 марта 2011

Вы не ссылаетесь на table1 внутри триггера.Используйте псевдо таблицу inserted, чтобы получить значения "после".Также помните, что обновление может повлиять на несколько строк.

Поэтому замените текущий оператор update на

UPDATE table2
SET    table2.annualyear = inserted.intannualyear
FROM   table2
       JOIN inserted
         ON table2.id = inserted.id  
9 голосов
/ 10 марта 2011

Обновлять записи в таблице2 нужно только в том случае, если задействован столбец intannualyear.Кроме того, это альтернативный синтаксис UPDATE для двух таблиц из того, что Мартин показал

IF UPDATE(intannualyear)
    UPDATE table2
    SET    annualyear = inserted.intannualyear
    FROM   inserted
    WHERE table2.id = inserted.id
1 голос
/ 09 апреля 2012

Согласно этому вопросу , если есть только одна "нисходящая" таблица, тогда другой вариант с правильно определенной связью внешнего ключа будет каскадным обновлением.

0 голосов
/ 28 ноября 2014

Чтобы дополнить приведенные выше ответы, если вам нужно проверить более одного столбца, вы можете использовать INNER JOIN между вставленным и удаленным или несколькими вызовами UPDATE ():

IF ( UPDATE(Col1) OR UPDATE(Col2) ) BEGIN ...
...