Найти измененные поля в триггере обновления - PullRequest
0 голосов
/ 12 февраля 2019

Какой самый простой способ получить список всех измененных полей в Update Trigger?

Самый компактный способ, который я мог придумать, это сделать что-то типа:

IF EXISTS(SELECT 1 FROM INSERTED INNER JOIN DELETED ON INSERTED.[FIELD_TO_CHECK] = DELETE.[FIELD_TO_CHECK])

Но это означало бы, что мне придется делать это для каждого поля, которое я хочу проверить.Я был бы признателен за подход с cursor, содержащим информацию обо всех измененных полях.

(Это не должно работать для массовых обновлений, не нужно ожидать более 1 записи в INSERTED ИЛИ DELETED)

Я добавил оператор if, чтобы игнорировать массовые обновления, поскольку они попадают в другую категорию.

1 Ответ

0 голосов
/ 12 февраля 2019

К сожалению, я не знаю какой-либо надежной встроенной функции, которая может дать вам указание, действительно ли значение столбца изменилось, когда оператор обновления запустил триггер.

Однако, есть довольно простооператор select, который вы можете выполнить, чтобы увидеть, какие значения изменились в каких строках:

SELECT IIF(ISNULL(NULLIF(I.Col, D.Col), NULLIF(D.Col, I.Col)) IS NULL, 0, 1) As Col_Updated
FROM Inserted I
JOIN Deleted D
    ON I.PrimaryKey = D.PrimaryKey

Функция NULLIF вернет null, если оба столбца равны.Если нет, он возвращает значение первого столбца.

Функция ISNULL вернет первый аргумент, который не является null или null, если оба аргумента равны нулю.

Использование ISNULL в результате двух NULLIF Функции, в которых значения столбцов обращены, приведут к null, если значения обоих столбцов одинаковы, даже если они оба равны нулю.Если значения отличаются, даже если одно из них равно нулю, а другое нет, тогда ISNULL вернет значение.Поэтому все, что вам нужно сделать, это проверить, вернул ли ISNULL значение или ноль - если он возвращает null, вы знаете, что значение столбца не изменилось.Если он возвращает значение, то оно изменяется.

Конечно, для столбцов, не допускающих значения NULL, вы можете упростить условие следующим образом:

SELECT IIF(I.Col <> D.Col, 1, 0) As Col_Updated
FROM...

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

Вы можете увидеть живое демо на rextester.

Обновление
Другой простой метод, который вы можете использовать, это:

IIF((I.Col IS NULL AND D.Col IS NULL) OR (I.Col = D.Col), 0, 1) as IsUpdated.

Этот метод основан на том факте, что сравнение нуля с чем-либо еще приведет к unknown, что в основном эквивалентно false.

Это немного более читабельно ИМХО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...