|
當(dāng)實(shí)例沒有做DDL Trigger和其它一些監(jiān)控時(shí),如何知道誰刪除了某個(gè)表?通過系統(tǒng)函數(shù)fn_dblog,fn_dump_dblog和默認(rèn)跟蹤可以找到。 1. 創(chuàng)建測試環(huán)境:新建個(gè)表,插入一條數(shù)據(jù),然后drop掉 CREATE DATABASE test GO 2. 通過sys.fn_dblog,找出相關(guān)信息: USE test
3. 上一步中這里得到了事務(wù)ID,開始時(shí)間,Suid,SPID等,但是執(zhí)行刪除的SPID可以已經(jīng)logout或者被重用了。所以要找出“當(dāng)時(shí)”的這個(gè)SPID。 先根據(jù)事務(wù)ID,找出被刪除的對象吧。查詢結(jié)果的“OBJECT: 9:245575913:0”,9是DB_ID,245575913是object_id,就是被刪除的表的object_id. SELECT TOP(1) [Lock Information] 4. 通常SQL Server實(shí)例安裝后會開啟一個(gè)默認(rèn)跟蹤(Default Trace),這個(gè)跟蹤會記錄一引起級別較高的重要信息。先找到默認(rèn)跟蹤 SELECT id,status,path FROM sys.traces 5. 根據(jù)前幾步中得到的trace path,事務(wù)ID,開始時(shí)間,SPID,object_id,通過默認(rèn)跟蹤得到進(jìn)一步的信息: SELECT DatabaseID,NTUserName,HostName,ApplicationName,LoginName, 這一步中就得到了誰刪除了這個(gè)表的更具體信息了。需要說明一下的是EventClass=47,EventSubclass=(0,1),這記錄了跟蹤事件的操作。 SELECT te.trace_event_id,te.name,tsv.subclass_value,tsv.subclass_name FROM sys.trace_events te INNER JOIN sys.trace_subclass_values tsv ON te.trace_event_id=tsv.trace_event_id WHERE te.trace_event_id=47 AND tsv.subclass_value IN(0,1) 6. 如果是生產(chǎn)環(huán)境的,事務(wù)日志可能被截?cái)喽恢赜酶采w了。這里就需要從日志備份中讀取日志信息來定位。需要用到fn_dump_dblog. 重新構(gòu)建測試環(huán)境: CREATE DATABASE test
GO SELECT [Transaction ID],[Transaction Name],[Begin Time],[Server UID],SPID FROM fn_dump_dblog (NULL, NULL, N'DISK', 1, N'D:\SQLSample\test.bck', DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT) WHERE [Transaction Name] %DROPOBJ%' SELECT TOP(1) [Lock Information] FROM fn_dump_dblog (NULL, NULL, N'DISK', 1, N'D:\SQLSample\test.bck', DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT) WHERE [Lock Information] %SCH_M OBJECT%' AND [Transaction ID]='0000:000002b8' 總結(jié): 1. 在SQL Server 2008 R2 SP2&SQL Server 2012 SP1測試通過 2. trace文件是rollover的,所以要找對path,同樣要從日志備份中查詢的話,也要找對日志備份文件的時(shí)間 3. fn_dblog和fn_dump_dblog是Undocumented Function. |
|
|