Jak można się dowiedzieć kto utworzył, skasował czy zmodyfikował obiekt w bazie danych jeśli nie ma założonego audytu? Czy to sytuacja bez rozwiązania ?
Jeśli z jakiegoś powodu zniknął nam indeks, tabela i chcemy znaleźć przyczynę możemy skorzystać z funkcji fn_trace_geteventinfo oraz z zapisów w tabeli sys.trace_events.
To, że w SQL Server samodzielnie nie mamy włączonego śledzenia przy pomocy trace, nie oznacza, że silnik nie monitoruje podstawowych zdarzeń.
Na stałe są monitorowane zdarzenia, które można wyświetlić za pomocą poniższego zapytania.
SELECT DISTINCT Trace.EventID
, TraceEvents.NAME AS Event_Desc
FROM ::fn_trace_geteventinfo(1) Trace
JOIN sys.trace_events TraceEvents
ON Trace.eventID = TraceEvents.trace_event_id
W rezultacie otrzymamy długą listę. W Naszym przypadku interesują nas zdarzenia o identyfikatorach 46,47 i 164.
Poniższe zapytanie zwróci domyślną ścieżkę i nazwę pliku trc z zapisanymi zdarzeniami.
SELECT path
FROM sys.traces
WHERE is_default = 1;
Znając już interesująca nas nazwę pliku można uruchomić skrypt zmieniając mu odnalezioną nazwę pliku wraz z jego lokalizacją.
SELECT
CASE EventClass
WHEN 46 THEN 'Object:Created'
WHEN 47 THEN 'Object:Deleted'
WHEN 164 THEN 'Object:Altered'
END
, DatabaseName
, ObjectName
, HostName
, ApplicationName
, LoginName
, StartTime
FROM ::fn_trace_gettable('F:\MSSQL15.INTERNAL\MSSQL\Log\log_68.trc', DEFAULT)
WHERE
EventClass IN (46,47,164)
AND EventSubclass = 0
ORDER BY StartTime DESC