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

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

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

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

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

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

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



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

Использование CLR и единой таблицы аудита.  
[Создание общего триггера аудита с SQL 2005 CLR](https://web.archive.org/web/20090429064008/www.sqljunkies.ddj.com/Article/4CD01686-5178-490C-A90A-5AEEF5E35915.scuk)

Использование триггеров и отдельной таблицы аудита для каждой проверяемой таблицы.  
[Как я могу проверить изменения в данных SQL Server?](https://web.archive.org/web/20071006100909/http://sqlserver2000.databases.aspfaq.com:80/how-do-i-audit-changes-to-sql-server-data.html)



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

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



[OmniAudit](http://www.krell-software.com/omniaudit/) может быть хорошим решением для вас. Я никогда не использовал его раньше, потому что я очень рад писать свои собственные процедуры аудита, но это звучит хорошо.



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

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

Другим вариантом является использование стороннего инструмента для этого, таких как[Аудит ApexSQL](http://www.apexsql.com/sql_tools_audit.aspx) или Изменить функцию сбора данных в SQL Server.



[ответ](https://stackoverflow.com/questions/3823/suggestions-for-implementing-audit-tables-in-sql-server#3848) и заполните таблицу аудита хранимой процедурой, вызываемой из триггеров таблицы.