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

Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl