Вчера мой начальник получил запрос от клиента, спрашивающий, как он может узнать, кто удалил некоторые данные в своей базе данных SQL Server (это экспресс-версия, если это имеет значение).
Я думал, что это можно найти в журнале транзакций (при условии, что он не был усечен) - это правильно? И если да, то как ты на самом деле собираешься найти эту информацию?
sql-server
transaction
delete
audit
Мэтт Вилко
источник
источник
fn_dblog
. Недостатком является то, что он возвращает базу данных,USERNAME()
а не гораздо более полезное имя для входа.Если база данных находится в режиме полного восстановления или если у вас есть резервные копии журналов транзакций, вы можете попробовать прочитать их, используя сторонние программы чтения журналов.
Вы можете попробовать ApexSQL Log (премиум, но имеет бесплатную пробную версию) или SQL Log Rescue (бесплатно, но только для SQL 2000).
источник
Хотя на этот вопрос ответили, хотелось бы добавить, что в SQL Server включена трассировка по умолчанию, и его можно использовать для определения, кто удалил / изменил объекты.
Объектные события
События объекта включают: объект изменен, объект создан и объект удален
примечание: SQL Server по умолчанию имеет 5 файлов трассировки, по 20 МБ каждый, и неизвестно поддерживаемый метод для изменения этого. Если у вас занятая система, файлы трассировки могут слишком быстро переноситься (даже в течение нескольких часов), и вы не сможете отследить некоторые изменения.
Отличный пример можно найти: трассировка по умолчанию в SQL Server - мощь аудита производительности и безопасности
источник
Вы можете попробовать эту процедуру, чтобы запросить файлы резервных копий журналов и найти, в каких файлах резервных копий журналов конкретное значение столбца таблицы было еще / последним.
Чтобы найти пользователя, после того, как вы найдете в какой резервной копии журнала значение, которое существовало в последний раз, вы можете восстановить базу данных до этой резервной копии журнала и затем следовать ответу Марка Стори-Смита .
Некоторые предпосылки
отказ
Это решение далеко не водонепроницаемо, и для его выполнения требуется гораздо больше работы.
Он не был протестирован в крупномасштабных средах или даже в любых средах, за исключением нескольких небольших тестов. Текущий запуск был на SQL Server 2017.
Вы можете использовать приведенную ниже процедуру от Мухаммеда Имрана, которую я модифицировал для работы с содержимым резервных копий журналов вместо содержимого журнала активной базы данных.
Таким образом, технически вы не выполняете восстановление, а просто записываете содержимое журнала во временную таблицу. Это, вероятно, все еще будет медленным и очень открытым для ошибок и проблем. Но это может сработать, в теории ™.
Хранимая процедура использует недокументированную
fn_dump_dblog
функцию для считывания файлов журнала.Тестовая среда
Рассмотрим эту базу данных, где мы вставляем несколько строк, делаем 2 резервных копии журнала, а в третьей резервной копии журнала мы удаляем все строки.
Процедура
Вы можете найти и скачать хранимую процедуру здесь .
Я не мог бы добавить это здесь, так как он больше, чем ограничение по количеству символов, и сделал бы этот ответ еще менее ясным, чем он есть.
Помимо этого, вы должны быть в состоянии запустить процедуру.
Запуск процедуры
Пример этого - когда я добавляю все свои файлы журналов (
4
) в хранимую процедуру и запускаю процедуру в поисках значения1Это получает меня:
Где мы можем найти, когда в последний раз произошла операция
value1
, удалить вlog3.trn
.Еще несколько тестовых данных, добавление таблицы с разными столбцами
Изменение имен файлов журнала и повторное выполнение процедуры
Результат
Новый прогон, ищущий integer (
2
) вval3
столбцеdbo.WrongDeletes2
Результат
Применяя ответ Марка Стори-Смита
Теперь мы знаем, что это произошло в третьем файле журнала, давайте восстановим до этого момента:
Выполнение последнего запроса в своем ответе
Результат для меня (сисадмин)
источник