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

20

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

<code>UPDATE person SET NAME = 'Mike' 
</code>

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

Ваш Ответ

2   ответа
35

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

update Person SET Name = Name

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

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

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

Дополнительным преимуществом является то, что это работает и для вставок, поскольку «Удаленные» будут пустыми и все строки из вставленных будут возвращены.

Error: User Rate Limit Exceeded Marian Zagoruiko
18

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

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

-- Anrion's 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
Error: User Rate Limit Exceeded

Похожие вопросы