Я возражаю!Одно слово, которое я не могу использовать, чтобы описать доступную опцию, элегантно.Я еще не нашел удовлетворительный способ выполнить то, что вы хотите.Есть варианты, но все они чувствуют себя немного неудовлетворительно.Когда / почему вы выбрали эти параметры, зависит от некоторых факторов, которые вы не упомянули.
- Как часто вам нужно «спрашивать», какие поля изменились?то есть пользователи редко переходят по ссылке "история аудита"?Или это все время, чтобы разобраться, как должно работать ваше приложение?
- Сколько стоит дисковое пространство?Я не обманываю, но я работал в местах, где стратегия хранения для нашего аудита была вопросом на миллион долларов, исходя из того, что нам платили за место в санатории.размер был.Вы можете быть тем же или наоборот.
Изменить захват данных
Как уже упоминалось @TGnat, вы можете использовать CDC.Этот метод хорош тем, что вы просто включаете отслеживание изменений, а затем вызываете sproc для начала отслеживания.CDC хорош, потому что это довольно эффективное хранилище и разумная мощность.Вы также устанавливаете это и забываете это, то есть, пока разработчики не придут и не захотят изменить форму ваших таблиц.Для здравомыслия разработчика вам нужно сгенерировать скрипт, который отключает / включает отслеживание для ваших сущностей.
Я заметил, что вы хотите исключить определенные столбцы, а не включить их.Вы можете сделать это с помощью трюка FOR XML PATH.Вы можете написать запрос наподобие следующего, а затем использовать переменную @capturedColList
при вызове sys.sp_cdc_enable_table
..
SET @capturedColList = SELECT Substring( (
SELECT ',' + COLUMN_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<YOUR_TABLE>' AND
COLUMN_NAME NOT IN ('excludedA', 'excludedB')
FOR XML PATH( '' )
) , 2, 8000)
Триггеры со случаями Второй вариант, который я вижу, заключается весть какая-то генерация кода.Это может быть внешний жгут или SPROC, который записывает ваши триггеры.Каким бы ни был ваш яд, он должен быть автоматизированным и универсальным.Но вы будете в основном писать код, который записывает DDL для триггеров, которые сравнивают ток с INSERTED или DELETED, используя тонны несвойственных операторов CASE для каждого столбца.
Здесь обсуждается стиль здесь .
Записать все, потом разобраться
Последний вариант - использовать триггер для записи каждого изменения строки.Затем вы пишете код (SPROCS / UDF), который может просматривать ваши данные журнала и распознавать, когда произошли изменения.Почему вы выбрали бы этот вариант?Дисковое пространство не имеет значения, и хотя вам необходимо уметь понимать, что изменилось, вы лишь редко задаете системе этот вопрос.
HTH,
-eric