Подтвердить что ты не робот

Как определить, изменилось ли что-либо в триггере обновления в t-sql

Как определить, что-то изменилось в триггере UPDATE? Например, у меня есть таблица с именем person с только одним столбцом NAME, которое содержит значение "Mike". Если я запустил

UPDATE person SET NAME = 'Mike' 

как я могу определить в триггере обновления ничего не изменилось? Я знаю о   ОБНОВЛЕНИЕ (COL) , но я не хочу перебирать столбцы. Есть ли другой способ сделать это?

4b9b3361

Ответ 1

Обновление (столбец) просто указывает, что столбец участвовал в обновлении, но не изменил его значение. Например,

update Person SET Name = Name

возвращает true в update (name), хотя имя не было изменено ни в одной строке.

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

insert into logTable (ID)
select a.ID
from
(
   select * from Inserted
   except
   select * from Deleted
) a

Добавленная выгода заключается в том, что это работает и для вставок, потому что Deleted будет пустым и все строки из вставленного будут возвращены.

Ответ 2

Ссылаясь на ответ Ариона выше:

Обязательно сравните записи по их первичному ключу, когда SELECT из JOIN, поскольку таблицы INSERTED и DELETED могут содержать более одной записи, которая, если игнорируется, может привести к неправильным результатам запроса и негативному влиянию на производительность БД.

-- Anrion answer - slightly modified
CREATE TRIGGER UpdatedTriggerName
ON person -- table name
AFTER UPDATE
AS 
IF EXISTS (
    SELECT
        *
    FROM
        INSERTED I
        JOIN
        DELETED D
            -- make sure to compare inserted with (same) deleted person
            ON D.ID = I.ID 
            AND D.NAME <> I.NAME -- only persons with changed name
    )
print 'something'
GO