Вернуться к статье

Хранимая процедура начала трассировки.

-- Данная хранимая процедура создаст очередь и запустит трассировку
IF object_id(`dbo.sp_start_mytrace`, `P`) IS NOT NULL
  DROP PROC dbo.sp_start_mytrace
GO

CREATE PROC dbo.sp_start_mytrace
  @spid_filter int = NULL, -- фильтр для идентификатора процесса сервера
  @dbid_filter int = NULL, -- фильтр для идентификатора базы данных 
  @email_address varchar(50) = NULL, -- адрес электронной почты (необязат. параметр)
  @filename varchar(260) = NULL – файл с данными трассировки
AS

DECLARE @queue_handle int – описатель очереди
DECLARE @data_columns int – битовая маска столбцов данных

-- Переменные, используемые для отправки сообщения по электронной почте
DECLARE @msg varchar(7990)
DECLARE @subject varchar(100)
DECLARE @NEWLINE char(2)
DECLARE @start_time datetime
DECLARE @host nvarchar(30)
DECLARE @login_name sysname

SET @NEWLINE = char(10) + char(13) – новая строка

-- Выбрать столбцы для сбора информации

SET @data_columns =
  67108864 |	-- Класс события
  1 |		-- Текстовые данные
  512 |		-- Имя приложения
  32 |		-- Имя пользователя Microsoft Windows NT® 
1024 |		-- Имя пользователя SQL 
131072 |	-- Использование CPU 
  32768 |	-- Операции чтения
  65536 |	-- Операции записи
  4096 |	-- Продолжительность
  16 |		-- Идентификатор соединения
  2048 |	-- Идентификатор процесса SQL (SPID)
  8192		-- Время начала

/* Список столбцов данных для сбора информации
Value 		Description
1		Text data
2		Binary data
4		Database ID
8		Transaction ID
16		Connection ID
32		Microsoft Windows NT® username
64		Windows NT domain name
128		Host name
256		Host process ID
512		Application name
1024		SQL username
2048		SQL process ID (SPID)
4096		Duration
8192		Start time
16384		End time
32768		Reads
65536		Writes
131072		CPU usage
524288		Severity
1048576	Event Subclass
2097152	Object ID
8388608	Index ID
16777216	Integer data
33554432	Server name
67108864	Event Class
*/  

-- Создать очередь

EXEC master..xp_trace_addnewqueue
  1000,			-- максимальный размер очереди, max_items
  5,			-- таймер, timeout
  95,			-- верхний порог, thread_boost 
  90,			-- нижний порог, thread_reduce
  @data_columns,	-- битовая маска столбцов данных 
  @queue_handle OUTPUT

-- Если не введено имя файла, куда записывать собираемую  информацию, то
-- по умолчанию будет использован файл c:\mytraceN.trc, где N – описатель очереди
IF @filename IS NULL
  SET @filename = `c:\mytrace` + CAST(@queue_handle AS varchar) + `.trc`

-- Выбрать события, которые должны фиксироваться
-- Запустить EXEC master..xp_trace_geteventnames для получения полного списка
--   классов событий и их имен

-- Событие сессии Connect
EXEC master..xp_trace_seteventclassrequired @queue_handle, 14, 1
-- Событие сессии Disconnect
EXEC master..xp_trace_seteventclassrequired @queue_handle, 16, 1
-- Событие сессии ExistingConnection
EXEC master..xp_trace_seteventclassrequired @queue_handle, 17, 1
-- Событие TSQL RPC:Completed
EXEC master..xp_trace_seteventclassrequired @queue_handle, 10, 1
-- Событие TSQL - SQL:BatchCompleted
EXEC master..xp_trace_seteventclassrequired @queue_handle, 12, 1

--  Установить фильтры

-- Исключить события, сгенерированные Profiler 
EXEC master..xp_trace_setappfilter
  @queue_handle,	 -- описатель очереди
  NULL,		 	 -- включить приложение
  `SQL Server Profiler%` – исключить приложение

-- Включить для сбора данных только указанный идентификатор процесса 
IF @spid_filter IS NOT NULL
  EXEC master..xp_trace_setspidfilter @queue_handle, @spid_filter

-- Включить для сбора данных только указанный идентификатор базы данных 
IF @dbid_filter IS NOT NULL
  EXEC master..xp_trace_setdbidfilter @queue_handle, @dbid_filter

-- записать полученную информацию в файл

EXEC master..xp_trace_setqueuedestination
  @queue_handle,	-- описатель очереди
  2,			-- место для записи результатов (2 - файл, 
-- 3 – журнал приложения,  4 - таблица, 5 – другой сервер)
  1,			-- включено (1 - yes, 0 - no)
  NULL,			-- сервер
  @filename		-- объект

-- Добавить строку в таблицу activetraces.
-- Позднее можно обратиться к этой таблице, чтобы выяснить, какую очередь следует 
-- удалить, используя хранимую процедуру sp_stop_mytrace.
INSERT INTO master.dbo.activetraces(queue_handle, tracefile_name)
  VALUES(@queue_handle, @filename)

-- Отправить сообщение по электронной почте с подробной информацией о трассе
SELECT @start_time = start_time, @host = host, @login_name = login_name
FROM master.dbo.activetraces
WHERE queue_handle = @queue_handle

SET @subject = `Trace: ` + cast(@queue_handle as varchar) + ` started`

SET @msg =
  `The following trace has started:` + @NEWLINE +
  `Queue Handle: ` + cast(@queue_handle as varchar) + @NEWLINE +
  `Start Time: ` + cast(@start_time as varchar) + @NEWLINE +
  `Host: ` + @host + @NEWLINE +
  `Login Name: ` + @login_name + @NEWLINE +
  `Destination File: ` + @filename + @NEWLINE + @NEWLINE +
  `Use EXEC sp_stop_mytrace ` + cast(@queue_handle as varchar) + ` to stop it.`

-- Вывод подробной информации о трассировке на экран
PRINT @msg

-- Отправка подробной информации о трассировке по электронной почте
if @email_address is not null
IF @email_address IS NOT NULL
  EXEC master..xp_sendmail
    @recipients = @email_address,
    @message = @msg,
    @subject = @subject

-- Начало передачи данных пользователю (начнется запись в файл)
EXEC master..xp_trace_startconsumer @queue_handle
GO