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.