Автор: Alexey Knyazev
Сегодня я расскажу про недокументированные расширенные хранимые процедуры (Extended Stored Procedures) для работы с журналом ошибок SQL Server и SQL Server Agent.
На самом деле при просмотре журнала SQL Server Logs через SSMS (SQL Server Management Studio) идёт обращение именно к этим двум основным процедурам (xp_readerrorlog и xp_enumerrorlogs), хоть и не на прямую, а через системные интерфейсные процедуры.
Особое внимание я уделю описанию входных параметрам этих недокументированных процедур.
И так, что же происходит, когда мы просматриваем журнал ошибок через SSMS?
Во первых мы определяем путь к нашей папке с журналами
select ServerProperty('ErrorLogFileName')
Затем выводим информацию о текущем журнале и о шести предыдущих
exec master.dbo.sp_enumerrorlogs
в качестве входного параметра можно указать
- 1 — Список журналов SQL Server (значение по умолчанию)
- 2 — Список журналов SQL Server Agent
Если обратиться к тексту этой процедуры, то можно увидеть, что это не более, чем «обёртка» для вызова другой процедуры
create proc sys.sp_enumerrorlogs( @p1 int = 1) as begin IF (not is_srvrolemember(N'securityadmin') = 1) begin raiserror(15003,-1,-1, N'securityadmin') return (1) end exec sys.xp_enumerrorlogs @p1 end
Теперь если мы нажмём View SQL Server Log
то мы сможем просмотреть все события выбранного журнала:
В этот момент идёт обращение к ещё одной процедуре-обёртке master..sp_readerrorlog.
Ниже текст этой процедуры:
create proc sys.sp_readerrorlog( @p1 int = 0, @p2 int = NULL, @p3 nvarchar(4000) = NULL, @p4 nvarchar(4000) = NULL) as begin if (not is_srvrolemember(N'securityadmin') = 1) begin raiserror(15003,-1,-1, N'securityadmin') return (1) end if (@p2 is NULL) exec sys.xp_readerrorlog @p1 else exec sys.xp_readerrorlog @p1,@p2,@p3,@p4 end
Как вы видите у неё четыре входных параметра:
- @p1 — номер журнала (0-6); 0 — текущий
- @p2 — чей журнал; 1 — SQL Server, 2 — SQL Server Agent
- @p3 — фильтр для поиска
- @p4 — второе условие для поиска
Пример:
exec master.dbo.sp_readerrorlog 0, 1, N'error'
exec master.dbo.sp_readerrorlog 0, 1, N'error', N'34050'
Но это ещё не всё. Если обратиться к самой расширенной процедуре xp_readerrorlog, то у неё есть ещё несколько параметров:
- @p5 — условие с какой даты выводить результат
- @p6 — условие до какой даты выводить результат из журнала
- @p7 — тип сортировки (asc/desc)
- @p8 — экземпляр SQL Server (@InstanceName), параметр появился в SQL Server 2012
Пример:
exec master.dbo.xp_readerrorlog 0, 1, null, null, '20130418', '20130419'
Если необходимо работать с журналом пользователю с минимальными привилегиями, то достаточно дать явные права на эти расширенные процедуры, но обращаться к ним придётся через запросы, т.к. SSMS использует интерфейсные процедуры, которые проверяют входимость пользователя в группу securityadmin.
use master go grant execute on xp_readerrorlog to [Ваш юзер] go