Один простой метод, который я использовал в прошлом, заключается в создании второй таблицы, структура которой повторяет структуру таблицы, которую я хочу аудитировать, а затем создать триггер обновления/удаления на главной таблице. Перед обновлением/удалением записи текущее состояние сохраняется в таблице аудита с помощью триггера.
Несмотря на свою эффективность, данные в таблице аудита не являются самыми полезными или простыми для составления отчетов. Мне интересно, есть ли у кого-нибудь лучший метод для аудита изменений данных?
Эти записи не должны слишком часто обновляться, но это очень чувствительная информация, поэтому для клиента важно, чтобы все изменения проверялись и о них можно было легко отчитаться.
Какой объем записи и чтения этой таблицы (таблиц) вы ожидаете?
Я использовал одну таблицу аудита, со столбцами Table, Column, OldValue, NewValue, User и ChangeDateTime - достаточно общую, чтобы работать с любыми другими изменениями в БД, и хотя в эту таблицу записывалось много данных, отчеты по этим данным были достаточно редкими, чтобы их можно было запускать в малоиспользуемые периоды дня.
Добавлено: Если количество данных по сравнению с количеством отчетов является проблемой, таблица аудита может быть реплицирована на сервер базы данных, доступный только для чтения, что позволит вам запускать отчеты, когда это необходимо, не отрывая главный сервер от выполнения своей работы.
Мы используем два дизайна стола для этого.
Один стол вмещает данные о сделке (база данных, имя таблицы, схема, колонка, заявление, которое вызвало сделку, имя хоста для логина, который начал сделку, дату, количество затронутых рядов и пары больше).
Второй стол только используется, чтобы сохранить изменения данных так, чтобы мы могли отменить изменения в случае необходимости и сообщить о старых/новых ценностях.
Другой выбор состоит в том, чтобы использовать сторонний инструмент для этого такой как [Аудит ApexSQL] (http://www.apexsql.com/sql_tools_audit.aspx) или особенность Сбора данных Изменения в SQL-сервере.
Я нашел эти две связи полезными:
Используя CLR и единственный контрольный стол < br/> Создание универсального аудита вызывает с CLR 2005 SQL
Используя спусковые механизмы и отдельный контрольный стол для каждого ревизуемого < стола; br/> Как я ревизую изменения данных о SQL-сервере?
Существуют ли встроенные пакеты аудита? В Oracle есть хороший пакет, который даже отправляет изменения аудита на отдельный сервер вне доступа любого злоумышленника, который модифицирует SQL.
Их пример потрясающий... он показывает, как предупредить любого, кто изменяет таблицы аудита.
OmniAudit может быть хорошим решением для ваших нужд. Я никогда не использовал его раньше, потому что меня вполне устраивает написание собственных процедур аудита, но звучит он неплохо.
Я использую подход, описанный Грегом в его ответ, и населяю контрольный стол с хранимой процедурой, названной от спусковых механизмов стола.