CREATE PROCEDURE [dbo].[spTraceMySessionStart] @spid INT AS -- Create a Queue DECLARE @rc INT DECLARE @TraceID INT DECLARE @maxfilesize bigint SET @maxfilesize = 5 DECLARE @filename NVARCHAR(245) SET @filename = 'C:\TraceMySession_' + CONVERT(NVARCHAR(10),@spid) + '_d' + REPLACE(CONVERT(VARCHAR, GETDATE(),111),'/','') + REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','') EXEC @rc = sp_trace_create @TraceID output, 2, @filename, @maxfilesize, NULL IF (@rc != 0) GOTO error -- Set the events DECLARE @on bit SET @on = 1 EXEC sp_trace_setevent @TraceID, 12, 1, @on EXEC sp_trace_setevent @TraceID, 12, 12, @on EXEC sp_trace_setevent @TraceID, 12, 14, @on -- Set the Filters DECLARE @intfilter INT DECLARE @bigintfilter bigint EXEC sp_trace_setfilter @TraceID, 12, 1, 0, @spid -- Set the trace status to start EXEC sp_trace_setstatus @TraceID, 1 -- display trace id for future references SELECT TraceID=@TraceID GOTO finish error: SELECT ErrorCode=@rc finish: 停止跟蹤 一旦你完成了跟蹤,那麼下面的這個預存程序將停止和關掉它。如果這不能運行,那麼伺服器端的跟蹤將會繼續運行和搜集其它任何正好具有相同SPID的會話資料。 這個預存程序排除一個參數,那就是TraceID。當你正好在運行第一個預存程序時,它將給你建立的TraceID。這是你傳遞到第二個預存程序以便停滯和關掉該跟蹤的值。 我也把它建立在自己的主要資料庫中,但是同樣地你可以建立在任何一個不同的資料庫中。
CREATE PROCEDURE [dbo].[spTraceMySessionStop] @traceId INT AS EXEC sp_trace_setstatus @traceId,0 EXEC sp_trace_setstatus @traceId,2 |
讓我們試試看 因此我們可以假設,我們想運行下面的代碼。
EXEC master.dbo.spTraceMySessionStart 52 USE AdventureWorks GO SELECT name FROM sys.sysobjects WHERE xtype = 'U' GO SELECT TOP 10 Title FROM HumanResources.Employee GO EXEC master.dbo.spTraceMySessionStop 2 |
首先我們需要做的是啟動這個跟蹤,也就是我指令碼中的第一行。我可以在底部看到我的SPID,也就是52,它已經在下面的中反白了。 圖一 當我運行這個預存程序時,輸出結果顯示的是TraceID,也就是“2”。我們需要儲存這個值以便後面使用。 圖二 在我運行了其它的命令並且全部完成之後,我可以運行後面的命令來停止和關掉這個跟蹤並使用我們上面得到的TraceID值“2”。 圖三 查看我們所捕捉的 如果我使用探查器開啟我們建立的檔案,我可以看到在我的會話中啟動並執行所有命令。你可以把這些命令複製到一個查詢時段以便重複使用。 圖四 另一個選擇是下載一個建立到SQL Server表的檔案或者使用SQL Server只查詢這些資料。 圖五
SELECT TEXTData, StartTime FROM ::fn_trace_gettable('c:\TraceMySession_52_d20090317120542.trc', DEFAULT) WHERE TEXTData IS NOT NULL |
|