Предложения по внедрению таблиц аудита в SQL Server?

Один простой метод, который я использовал в прошлом, - это просто создание второй таблицы, структура которой отражает ту, которую я хочу проверять, а затем создание триггера обновления / удаления для основной таблицы. Перед обновлением / удалением записи текущее состояние сохраняется в таблице аудита с помощью триггера.

Хотя данные в таблице аудита эффективны, они не самые полезные или простые для составления отчетов. Мне интересно, есть ли у кого-нибудь лучший метод аудита изменений данных?

Обновлений этих записей не должно быть слишком много, но это очень конфиденциальная информация, поэтому для клиента важно, чтобы все изменения проверялись и легко составлялись отчеты.

Ответов (6)

Решение

Сколько вы ожидаете от записи или чтения этой таблицы (таблиц)?

Я использовал единую таблицу аудита со столбцами для Table, Column, OldValue, NewValue, User и ChangeDateTime - достаточно общую, чтобы работать с любыми другими изменениями в БД, и хотя в эту таблицу было записано МНОГО данных, отчеты эти данные были достаточно разреженными, чтобы их можно было запускать в периоды низкой активности в течение дня.

Добавлено: если количество данных и отчетов вызывает беспокойство, таблица аудита может быть реплицирована на сервер базы данных, доступный только для чтения, что позволит вам при необходимости запускать отчеты, не отвлекая главный сервер от выполнения своей работы.

Есть ли встроенные пакеты аудита? У Oracle есть хороший пакет, который даже отправляет изменения аудита на отдельный сервер вне доступа любого злоумышленника, изменяющего SQL.

Их пример потрясающий ... он показывает, как предупредить любого, кто изменяет таблицы аудита.

Для этого мы используем дизайн с двумя таблицами.

Одна таблица содержит данные о транзакции (база данных, имя таблицы, схема, столбец, приложение, которое инициировало транзакцию, имя хоста для входа в систему, которая запустила транзакцию, дату, количество затронутых строк и еще несколько).

Вторая таблица используется только для хранения изменений данных, чтобы мы могли отменить изменения при необходимости и сообщить о старых / новых значениях.

Другой вариант - использовать для этого сторонний инструмент, такой как ApexSQL Audit или Change Data Capture в SQL Server.

Я использую подход, описанный Грегом в его ответе, и заполняю таблицу аудита хранимой процедурой, вызываемой из триггеров таблицы.

OmniAudit может быть хорошим решением для вас. Я никогда не использовал его раньше, потому что мне очень нравится писать собственные процедуры аудита, но звучит неплохо.

Я нашел эти две ссылки полезными:

Использование CLR и единой таблицы аудита.
Создание универсального триггера аудита с помощью SQL 2005 CLR

Использование триггеров и отдельной таблицы аудита для каждой проверяемой таблицы.
Как я могу контролировать изменения данных SQL Server?