Журнал вставленных / обновленных / удаленных строк во всех таблицах для данной базы данных в SQL Server 2008
Каков наилучший способ отслеживать / регистрировать вставленные / обновленные / удаленные строки во всех таблицах для данной базы данных в SQL Server 2008?
Или в SQL Server 2008 есть лучшая функция "Аудит"?
5 ответов
Сбор данных изменений предназначен для того, чтобы делать то, что вы хотите, но он требует, чтобы каждая таблица настраивалась индивидуально, поэтому в зависимости от количества имеющихся у вас таблиц может потребоваться некоторая логистика. По умолчанию данные также будут храниться в таблицах захвата только в течение нескольких дней, поэтому вам может потребоваться пакет служб SSIS для их извлечения и хранения в течение более длительных периодов времени.
Короткий ответ: нет единого решения, подходящего для всех. Это зависит от системы, но и требований, но здесь есть несколько разных подходов.
Триггеры DML
Относительно легко реализовать, потому что вы должны написать тот, который хорошо работает для одной таблицы, а затем применить его к другим таблицам.
Недостатком является то, что он может запутаться, когда у вас много таблиц и даже больше триггеров. Управление 600 триггерами для 200 таблиц (триггер вставки, обновления и удаления для каждой таблицы) - непростая задача. Кроме того, это может повлиять на производительность.
Создание триггеров аудита в SQL Server
Записывать изменения в таблицу базы данных с помощью триггера
Изменить захват данных
Очень прост в реализации, изначально поддерживается, но только в корпоративной версии, которая может стоить много долларов;). Еще одним недостатком является то, что CDC все еще не так развит, как должно быть. Например, если вы измените свою схему, данные истории будут потеряны.
Анализ журнала транзакций
Большим преимуществом этого является то, что все, что вам нужно сделать, это перевести базу данных в режим полного восстановления, и вся информация будет храниться в журнале транзакций. Однако, если вы хотите сделать это правильно, вам понадобится сторонний читатель журнала, потому что это не поддерживается изначально.
Прочитайте файл журнала (*.LDF) в SQL Server 2008
Проводник / анализатор журнала транзакций SQL Server
Если вы хотите реализовать это, я рекомендую вам попробовать некоторые сторонние инструменты, которые существуют там. Я работал с парой инструментов из ApexSQL, но есть и хорошие инструменты от Idera и Netwrix
ApexSQL Log - аудит путем чтения журнала транзакций
ApexSQL Comply - использует трассировки в фоновом режиме, а затем анализирует эти трассы и сохраняет результаты в центральной базе данных.
Отказ от ответственности: я не связан ни с одной из компаний, упомянутых выше.
Я не помню, есть ли уже какой-то инструмент для этого, но вы всегда можете использовать триггеры (тогда у вас будет доступ к временным таблицам с измененными строками INSERTED и DELETED). К сожалению, это может быть довольно трудной задачей, если вы хотите отслеживать все таблицы. Я считаю, что должно быть какое-то более простое решение, но не помню, как я сказал.
РЕДАКТИРОВАТЬ.
Может быть, это может быть полезно: - Изменить отслеживание http://msdn.microsoft.com/en-us/library/cc280462.aspx
Журналы sql сервера невозможно проанализировать просто так. Есть некоторые сторонние инструменты, доступные для чтения журналов, но, насколько я знаю, вы не можете запросить у них статистику и тому подобное. Если вам нужна такая информация, вам нужно создать своего рода аудит, чтобы фиксировать все эти события в отдельных таблицах. Вы можете использовать "триггеры DDL".
http://msdn.microsoft.com/en-us/library/cc280386.aspx
Это позволяет проводить аудит на уровне базы данных; этого может быть или не быть достаточно для удовлетворения бизнес-требований, поскольку записи в базе данных обычно не имеют особого смысла без логики их склеивания. Например, зная, что пользователь x вставил в таблицу "time_booked" запись с внешним ключом к таблицам "projects", "users", "time_status", может не иметь особого смысла без запроса SQL склеить эти 4 таблицы все вместе.
Вам также может понадобиться, чтобы каждый пользователь базы данных подключался со своим собственным идентификатором пользователя - это хорошо с интегрированной безопасностью и клиентским приложением, но, вероятно, не будет работать с веб-сайтом, использующим пул соединений.