Mój szef otrzymał wczoraj zapytanie od klienta z pytaniem, w jaki sposób można dowiedzieć się, kto usunął niektóre dane z bazy danych SQL Server (jeśli to ważne, jest to edycja ekspresowa).
Myślałem, że można to znaleźć w dzienniku transakcji (pod warunkiem, że nie zostało ono obcięte) - czy to prawda? A jeśli tak, to w jaki sposób możesz znaleźć te informacje?
sql-server
transaction
delete
audit
Matt Wilko
źródło
źródło
fn_dblog
. Jednym minusem jest to, że zwraca bazę danych,USERNAME()
a nie znacznie bardziej przydatną nazwę logowania.Jeśli baza danych znajduje się w trybie pełnego odzyskiwania lub jeśli masz kopie zapasowe dziennika transakcji, możesz spróbować je odczytać przy użyciu zewnętrznych czytników dzienników.
Możesz wypróbować ApexSQL Log (premium, ale ma darmową wersję próbną) lub SQL Log Rescue (bezpłatny, ale tylko SQL 2000).
źródło
Mimo, że jest to odpowiedź, chciałem dodać, że SQL Server ma włączone śledzenie domyślne i można go użyć, aby dowiedzieć się, kto upuścił / zmienił obiekty.
Zdarzenia obiektowe
Do zdarzeń obiektowych należą: Obiekt zmieniony, Obiekt utworzony i Obiekt usunięty
Uwaga: SQL Server domyślnie ma 5 plików śledzenia, po 20 MB każdy i nie ma znanej obsługiwanej metody zmiany tego. Jeśli masz zajęty system, pliki śledzenia mogą przewijać się o wiele za szybko (nawet w ciągu kilku godzin) i możesz nie być w stanie uchwycić niektórych zmian.
Doskonały przykład można znaleźć: Domyślny ślad w SQL Server - moc kontroli wydajności i bezpieczeństwa
źródło
Możesz wypróbować tę procedurę, aby wykonać kwerendę w plikach kopii zapasowej dziennika i dowiedzieć się, w których plikach kopii zapasowej dziennika znajduje się konkretna wartość kolumny tabeli.
Aby znaleźć użytkownika, po znalezieniu w kopii zapasowej dziennika wartości, która ostatnio istniała, możesz przywrócić bazę danych do momentu utworzenia kopii zapasowej dziennika, a następnie postępować zgodnie z odpowiedzią Marka Storey-Smitha .
Niektóre warunki wstępne
Zrzeczenie się
To rozwiązanie jest dalekie od wodoodporności i wymaga dużo więcej pracy.
Nie został przetestowany w środowiskach wielkoskalowych, a nawet w innych środowiskach oprócz kilku małych testów. Bieżący przebieg miał miejsce na SQL Server 2017.
Możesz skorzystać z poniższej procedury od Muhammada Imrana , którą zmodyfikowałem do pracy z zawartością kopii zapasowych dziennika zamiast zawartości dziennika żywej bazy danych.
W ten sposób technicznie nie przywracasz, ale zamiast tego zrzucasz zawartość dziennika do tabeli tymczasowej. Prawdopodobnie będzie nadal powolny i jest bardzo otwarty na błędy i problemy. Ale to może działać, teoretycznie ™.
Procedura przechowywana używa nieudokumentowanej
fn_dump_dblog
funkcji do odczytu plików dziennika.Środowisko testowe
Rozważ tę bazę danych, w której wstawiamy niektóre wiersze, wykonujemy 2 kopie zapasowe dziennika, a przy trzeciej kopii zapasowej dziennika usuwamy wszystkie wiersze.
Procedura
Można znaleźć i pobrać procedury przechowywanej tutaj .
Nie mogłem go tutaj dodać, ponieważ jest on większy niż limit postaci, i uczyniłbym tę odpowiedź jeszcze mniej wyraźną niż jest.
Oprócz tego powinieneś być w stanie uruchomić procedurę.
Uruchamianie procedury
Przykładem tego jest dodanie wszystkich moich plików dziennika (
4
) do procedury składowanej i uruchomienie procedury w poszukiwaniu wartości1To daje mi:
Gdzie możemy znaleźć datę ostatniej operacji
value1
, usuń wlog3.trn
.Więcej danych testowych, dodając tabelę z różnymi kolumnami
Zmiana nazw plików dziennika i ponowne wykonanie procedury
Wynik
Nowy przebieg, szukanie liczby całkowitej (
2
) wval3
kolumniedbo.WrongDeletes2
Wynik
Stosując Mark Storey-Smith „s odpowiedź
Wiemy teraz, że stało się to w trzecim pliku dziennika, przywróćmy do tego momentu:
Uruchomienie ostatniego zapytania w odpowiedzi
Wynik dla mnie (sysadmin)
źródło