Наша система работает на SQL Server 2000, и мы находимся в процессе подготовки к обновлению до SQL Server 2008. У нас есть много кода запуска, где нам нужно обнаружить изменение в данном столбце, а затем работать с этим если он изменился.
Очевидно, что SQL Server предоставляет UPDATE() и COLUMNS_UPDATED(), но эти функции говорят только о том, какие столбцы были вовлечены в оператор SQL, не, которые фактически изменили столбцы.
Чтобы определить, какие столбцы были изменены, вам нужен код, похожий на следующий (для столбца, который поддерживает NULL):
IF UPDATE(Col1)
SELECT @col1_changed = COUNT(*)
FROM Inserted i
INNER JOIN Deleted d ON i.Table_ID = d.Table_ID
WHERE ISNULL(i.Col1, '<unique null value>')
!= ISNULL(i.Col1, '<unique null value>')
Этот код необходимо повторить для каждого столбца, который вам интересен при тестировании. Затем вы можете проверить "измененное" значение, чтобы определить, следует ли выполнять дорогостоящие операции. Конечно, этот код сам по себе проблематичен, так как он только сообщает вам, что хотя бы одно значение в столбце изменилось по всем измененным строкам.
Вы можете протестировать отдельные инструкции UPDATE с помощью следующего:
UPDATE Table SET Col1 = CASE WHEN i.Col1 = d.Col1
THEN Col1
ELSE dbo.fnTransform(Col1) END
FROM Inserted i
INNER JOIN Deleted d ON i.Table_ID = d.Table_ID
... но это не работает, когда вам нужно вызвать хранимую процедуру. В этих случаях, насколько я могу судить, вы должны откинуться на другие подходы.
Мой вопрос заключается в том, имеет ли кто-нибудь представление (или, еще лучше, жесткие данные) о том, какой наилучший/самый дешевый подход относится к проблеме предикации операции базы данных в триггере по вопросу о том, имеет ли значение конкретного столбца в модифицированной строке фактически изменился или нет. Ни один из вышеприведенных методов не кажется идеальным, и мне было интересно, существует ли лучший метод.