Как сделать триггер, который влияет только на строку, которая была обновлена ​​/ вставлена? - PullRequest
4 голосов
/ 30 января 2012

У меня есть таблица с двумя столбцами, где мне нужен один (columnB), чтобы быть копией другого (columnA). Итак, если строка вставлена ​​или обновлена, я хочу, чтобы значение с columnA было скопировано в columnB.

Вот что у меня сейчас:

CREATE TRIGGER tUpdateColB
ON products
FOR INSERT, UPDATE AS
    BEGIN
        UPDATE table
        SET columnB = columnA
    END

Проблема теперь в том, что запрос затрагивает все строки, а не только ту, которая была обновлена ​​или вставлена. Как мне исправить это?

Ответы [ 2 ]

5 голосов
/ 30 января 2012

Если у вас есть столбец первичного ключа, id, (и у вас должен быть первичный ключ), присоединитесь к таблице inserted (чтобы триггер мог обрабатывать несколько строк):

CREATE TRIGGER tUpdateColB 
ON products 
FOR INSERT, UPDATE AS 
    BEGIN 
        UPDATE table 
        SET t.columnB = i.columnA 
        FROM table t INNER JOIN inserted i ON t.id = i.id
    END 

Но если ColumnB всегда является копией ColumnA, почему бы не создать вместо него Вычисляемый столбец ?

Использование вставленных и удаленных таблиц

0 голосов
/ 30 января 2012

Существует специальная таблица inserted, доступная в триггерах, которая будет содержать версию "после" строк, на которые воздействует операция INSERT или UPDATE. Точно так же существует таблица deleted, которая будет содержать версию «до» строк, на которые воздействует операция UPDATE или DELETE.

Итак, для вашего конкретного случая:

UPDATE t
    SET t.columnB = t.columnA
    FROM inserted i
        INNER JOIN table t
            ON i.PrimaryKeyColumn = t.PrimaryKeyColumn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...