Как использовать триггер обновления для обновления другой таблицы?

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

У меня есть таблица1 с столбцом года, и если приложение обновляет столбец в этом году, мне нужно обновить таблицу 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

Ответы

Ответ 1

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

Итак, замените текущую инструкцию update на

UPDATE table2
SET    table2.annualyear = inserted.intannualyear
FROM   table2
       JOIN inserted
         ON table2.id = inserted.id  

Ответ 2

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

IF UPDATE(intannualyear)
    UPDATE table2
    SET    annualyear = inserted.intannualyear
    FROM   inserted
    WHERE table2.id = inserted.id

Ответ 3

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

Ответ 4

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

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