Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Требование 3. На сервере должна быть включена трассировка по умолчанию (default trace).
На тему механизма трассирования в SQL Server, я летом написал многословный пост в своем MSDNовском блоге, так что если кто-либо еще не сподобился поработать с трассировками и хочет в доступной форме узнать, что это такое, может его почитать.
Помимо пользовательских трасс, в SQL Server имеется еще служебная, или дефолтная. Полюбопытствуйте ради хохмы, какие трассы сейчас имеются у вас на сервере:
select * from sys.traces
Скрипт 1
Та, у которой в графе is_default будет стоять 1, это будет она. Обычно она самая первая с id = 1, если вы ее до этого не касались. Трассы с NULL в графе path и 1 в поле is_rowset - это, скорее всего, те, что запущены у вас из профайлера. Требование 3 говорит, что служебная трасса должна быть запущена. По умолчанию, она на то и является служебной, что создается и запускается в момент старта сервера, так что если вы с ней специально ничего с ней плохого не делали, требование должно выполняться. Про служебную трассу имеется скупое упоминание в BOL: http://msdn.microsoft.com/ru-ru/library/ms175513.aspx, что совершенно незаслуженно по отношению к такому интересному объекту. Более подробно можно прочитать в статье Kalen Delaney - http://www.sqlmag.com/Articles/ArticleID/48939/pg/1/1.html.
Проверить, что трасса стартована, можно, взглянув на колонку status в выдаче Скрипта 1. 1 означает, что она бежит, 0 - что стоит. Но это для обычной трассы. Если служебная трасса остановлена, в sys.traces ее просто нет. Кроме того, в отличие от обычной трассы, управление которой осуществляется при помощи процедуры sp_trace_setstatus @traceid = <id трассы>, @status = 1 (старт), 0 (стоп), 2 (убить), служебную трассу нельзя убить, а остановить/запустить можно только при помощи sp_configure. Так осуществляется ее останов:
exec sp_configure @configname = 'show advanced', @configvalue = 1
reconfigure
exec sp_configure @configname = 'default trace enabled', @configvalue = 0
reconfigure with override
Скрипт 2
А так, соответственно, запуск:
exec sp_configure @configname = 'default trace enabled', @configvalue = 1
reconfigure with override
Скрипт 3
Через sp_configure можно также посмотреть текущий статус трассы подобно тому, как мы смотрели его в поле status выдачи Скрипта 1.
exec sp_configure @configname = 'default trace enabled'
Скрипт 4
0 будет означать стояние, 1 - что она запущена.
Резюмируя, проверку и приведение в соответствие Требованию 3 можно выполнить при помощи следующего скрипта:
declare @status tinyint
select top 1 @status = status from sys.traces where is_default = 1
if @status is null begin
exec sp_configure @configname = 'default trace enabled', @configvalue = 1
reconfigure
end
Скрипт 5
Обратите внимание, что проверка выполняется не на @status = 0, а @status is null, потому что, как отмечалось выше, отключение служебной трассы приводит не к изменению поля status, а к исчезанию ее из sys.traces. Это все, что касается Требования 3. Дальнейшее для общего развития.
События, которые собирает SQL Trace, он умеет выплевывать в два типа назначения: в файл и в rowset. Примером приемника первого типа является служебная трасса, второго - профайлер. В случае приемника второго типа возможна потеря событий, если они порождаются слишком быстро и rowset не успевает их разгребать. Создать приемник первого типа можно при помощи хранимой процедуры sp_trace_create. В параметрах указывается шаблон имени файла, максимальный размер, до которого он сможет расти, прежде чем трасса переметнется писать в новый файл, и размер скользящего окна, т.е. при заведении нового файла на сколько файлов нужно отсчитать назад, чтобы оттуда начать удаление старых файлов. Эти и другие атрибуты трассы можно посмотреть в sys.traces или при помощи функции master.sys.fn_trace_getinfo(), параметром которой служит идентификатор трассы (0 - для всех трасс). Чтобы не заглядывать всякий раз в документацию, вспоминая, что какое свойство значит, я вставил их в запрос. Кроме того, распайвотил результат, пустив названия свойств по колонкам. Для служебной трассы имеем:
with cte(TraceID, TraceOption, FileName, MaxSize_MB, StopTime, IsRunning)
as (select * from ::fn_trace_getinfo(1) pivot (min(value) for property in ([1], [2], [3], [4], [5])) pt)
select
TraceID,
case TraceOption when 2 then '2 = TRACE_FILE_ROLLOVER' when 4 then '4 = SHUTDOWN_ON_ERROR' when 6 then '6 = ROLLOVER_AND_SHUTDOWN' when 8 then '8 = PRODUCE_BLACKBOX' else TraceOption end,
FileName, MaxSize_MB, StopTime, IsRunning
from cte
TraceID |
(No column name) |
FileName |
MaxSize_MB |
StopTime |
IsRunning |
1 |
2 = TRACE_FILE_ROLLOVER |
C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\log_27.trc |
20 |
NULL |
1 |
Скрипт 6
Эта информация представляет собой подмножество из sys.traces.
Интерес также представляют события, собираемые служебной трассой и какая информация (колонки) собираются по каждому событию. Ответ дает функция master.sys.fn_trace_geteventinfo(). Чтобы получить события и колонки не в виде своих id, а в виде осмысленных описаний, ее надо сджойнить с DMV sys.trace_events и sys.trace_columns:
select f.eventid, e.name as EventName, e.category_id, cat.name as EventCategoryName, f.columnid, c.name as ColumnName
from ::fn_trace_geteventinfo(1) f
inner join sys.trace_events e on f.eventid = e.trace_event_id
inner join sys.trace_categories cat on e.category_id = cat.category_id
inner join sys.trace_columns c on f.columnid = c.trace_column_id
Скрипт 7
Аналогично, посмотреть, не навешаны ли на события трассы какие-либо фильтры, можно узнать из функции master.sys.fn_trace_getfilterinfo().
Прочитать результаты трассы можно функцией fn_trace_gettable(). В качестве первого параметра выступает шаблон файла, куда пишется трасса. В свойствах трассы (Скрипт 6) мы видели текущий файл, куда в данный момент пишется трасса - log_27.trc. 27 - это монотонно прирастающий порядковый номер файла трассы, значит, шаблон будет log.trc:
select * from master.sys.fn_trace_gettable('C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\log.trc', default)
Скрипт 8
Обратите внимание, что событие 14 (Audit Login - см. sys.trace_events) не собирается служебной трассой (поставьте в Скрипте 7 where f.eventid = 14). Довключить его туда нельзя. Структуру служебной трассы модифицировать нельзя. Можно только смотреть, какие события/колонки, фильтры в нее входят. Стало быть, для решения задачи мониторинга успешных попыток логона на сервер в предыдущем посте пришлось бы создавать отдельную трассу, не реши мы ее при помощи аудита. А то я было грешным делом подумал, что требование по дефолтной трассе нужно им, чтобы проверить остальные требования.
Алексей Шуленин, Microsoft