В триггере, как проверить, не изменились ли поля?

dba.stackexchange https://dba.stackexchange.com/questions/11896

  •  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

Я делаю это во всех своих триггерах аудита. Это короткое и, по сути, определенно сокращает потраченные впустую ввод -вывод.

Обновление: Извините, я неправильно прочитал ваш вопрос. Я думал, что вы спросили, как выйти из триггера, если данные не изменились.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top