Ki törölte a táblát???

Hol volt, hol nem volt, volt egyszer egy SQL Server 2008 R2 ahol se DDL Trigger, se audit, se semmi sem volt beállítva és dbo joga volt a fejlesztőknek az éles környzetben. Történt egy nap – nevezetesen szerdán – hogy valaki törölt egy táblát. E miatt sajnos a program nem az elvárásoknak megfelelően működött. Szerencsére mentés volt, de meg szerettük volna tudni, hogy ki követte el a dolgot, illetve, hogy mikor is történt az egész. Az időpontra azért volt szükség, hogy a point-in-time restore rendben működjön. Itt most a helyreállítás nem fontos, csak az, hogyan kaptunk vissza a “ki és mikor” információkat.

Szerencsés esetben legalább a default trace be van kapcsolva, így abban jó eséllyel meg lehet találni, hogy ki és mikor törölt egy adott objektumot. Az alábbi példa során a table1 tábla lesz kitörölve, amit az utolsó lekérdezés segítségével meg lehet keresni a default trace-ben:

 1USE [master];
 2GO
 3--létrehozok egy teszt adatbázist
 4IF DATABASEPROPERTYEX('TrLogRead', 'Version') > 0
 5    DROP DATABASE [TrLogRead];
 6GO
 7 
 8CREATE DATABASE [TrlogRead];
 9GO
10--átállítom a recovery model-t FULL-ra
11ALTER DATABASE [TrLogRead] SET RECOVERY FULL;
12GO
13 
14USE [TrlogRead];
15GO
16--teszt tábla létrehozása
17CREATE TABLE Table1
18(
19    col1 int identity,
20    col2 char(1) default 'A'
21);
22GO
23--teszt adatok létrehozása
24SET NOCOUNT ON;
25INSERT INTO Table1 DEFAULT VALUES
26GO 1000
27 
28--adatbázis mentés
29BACKUP DATABASE [TrlogRead] TO DISK = N'C:\temp\trlogread_full.bak' WITH INIT, STATS=10;
30 
31BACKUP LOG [TrlogRead] TO DISK = N'C:\temp\trlogread_1.trn' WITH INIT, STATS=10;
32GO
33 
34--most kitörlöm a táblát
35DROP TABLE Table1;
36 
37--újabb tr log mentés
38BACKUP LOG [TrlogRead] TO DISK = N'C:\temp\trlogread_2.trn' WITH INIT, STATS=10;
39GO
40 
41--a default trace mindig id=1
42DECLARE @DefaultTracePath nvarchar(255);
43SET @DefaultTracePath = (SELECT [Path] FROM sys.traces WHERE id = 1)
44 
45SELECT
46    [LoginName],
47    [HostName],
48    [ApplicationName],
49    [StartTime],
50    [DatabaseName],
51    [ObjectName]
52FROM
53    sys.fn_trace_gettable(@DefaultTracePath, DEFAULT)  T
54JOIN
55    sys.trace_events TE ON T.EventClass = TE.trace_event_id
56WHERE
57    EventClass = 47
58AND
59    [DatabaseID] = DB_ID()
60AND
61    [ObjectName] LIKE '%table1%'

Ha nem vagyok ennyire szerencsés, akkor a transaction log-ban kell turkálni. Itt is, ha szerencsém van, akkor elég az aktív transaction log-ba belenézni, ha nem, akkor a mentésekben kell. Ezt az fn_dblog és az fn_dump_dblog nem dokumentált TVF-ek segítségével lehet.