В триггере, как проверить, не изменились ли поля?
-
16-10-2019 - |
Вопрос
Если мы получим оператор обновления, который не проверяет, изменилось ли значение в предложении «Где», каковы различные способы игнорировать это обновление внутри триггера?
Я знаю, что мы можем провести сравнение каждого отдельного поля (также обрабатывая сторону Isnull), но где это таблица, которая имеет более 50 полей, есть ли более быстрый/простой способ сделать это?
Примечание: это может быть использовано для уменьшения IO/шума в аудиторских записях и т. Д.
ПРИМЕР
Для таблицы:
CREATE TABLE myTest
(ID int NOT NULL IDENTITY(1,1),
Field1 varchar(10) NULL,
Field2 varchar(20) NULL)
с запуска после обновления, содержащего:
INSERT INTO myTestAudit (ID, Field1, Field2, DateTimeUpdate)
SELECT ID, Field1, Field2, getDate()
FROM inserted
с начальными значениями:
INSERT INTO myTest (Field1, Field2)
SELECT 'a', 'b' UNION ALL
SELECT 'a', 'c'
Теперь запустите обновление:
UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
Решение
Чтобы вернуть ряды, где изменилось хотя бы одно значение, вы можете использовать
SELECT /*TODO: Column List*/
FROM INSERTED I
JOIN DELETED D
ON I.ID = D.ID
AND EXISTS (SELECT I.*
EXCEPT
SELECT D.*)
Другие советы
Поместите это в качестве самой первой строки в вашем триггере:
-- Exit trigger if no data was actually modified
IF (@@ROWCOUNT = 0) return
Я делаю это во всех своих триггерах аудита. Это короткое и, по сути, определенно сокращает потраченные впустую ввод -вывод.
Обновление: Извините, я неправильно прочитал ваш вопрос. Я думал, что вы спросили, как выйти из триггера, если данные не изменились.