Я протестую! Одно слово, которое я не могу использовать для описания доступной опции, - это элегантность. Мне еще предстоит найти удовлетворительный способ достичь того, чего вы хотите. Есть варианты, но все они немного неудовлетворительны. Когда и почему вы выбрали эти варианты, зависит от некоторых факторов, которые вы не упомянули.
- Как часто нужно «спрашивать», какие поля изменились? То есть пользователи нечасто нажимают на ссылку «история аудита»? Или это все время, чтобы понять, как ваше приложение должно себя вести?
- Сколько вам стоит дисковое пространство? Я не легкомыслен, но я работал там, где стратегия хранения для нашего аудита составляла проблему на миллион долларов, основанную на том, что мы платили за сан-пространство, то есть дорогое восстановление SQL-сервера не принималось во внимание, хранение размер был. Вы можете быть таким же или противоположным.
Сбор данных об изменениях
Как упоминал @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,
-эрик
person
EBarr
schedule
24.02.2011