![](/image.axd?picture=%2f2013%2f04%2fxp_readerrorlog.png)
Сегодня я расскажу про недокументированные расширенные хранимые процедуры (
Extended Stored Procedures) для работы с журналом ошибок SQL Server и SQL Server Agent.
На самом деле при просмотре журнала
SQL Server Logs через SSMS (SQL Server Management Studio) идёт обращение именно к этим двум основным процедурам (xp_readerrorlog и xp_enumerrorlogs), хоть и не на прямую, а через системные интерфейсные процедуры.
Особое внимание я уделю описанию входных параметрам этих недокументированных процедур.
И так, что же происходит, когда мы просматриваем журнал ошибок через SSMS?
![](/image.axd?picture=%2f2013%2f04%2fxprel01.png)
Во первых мы определяем путь к нашей папке с журналами
select ServerProperty('ErrorLogFileName')
![](/image.axd?picture=%2f2013%2f04%2fxprel02.png)
Затем выводим информацию о текущем журнале и о шести предыдущих
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
По коду процедуры видно, прежде чем обратиться к расширенной хранимой процедуре xp_enumerrorlogs, идёт проверка, что пользователь входит в серверную роль securityadmin.
Теперь если мы нажмём
View SQL Server Log![](/image.axd?picture=%2f2013%2f04%2fxprel04.png)
то мы сможем просмотреть все события выбранного журнала:
![](/image.axd?picture=%2f2013%2f04%2fxprel05.png)
В этот момент идёт обращение к ещё одной процедуре-обёртке
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'
exec master.dbo.xp_readerrorlog 0, 1, null, null, '20130418', '20130419', N'desc'
Если необходимо работать с журналом пользователю с минимальными привилегиями, то достаточно дать явные права на эти расширенные процедуры, но обращаться к ним придётся через запросы, т.к. SSMS использует интерфейсные процедуры, которые проверяют входимость пользователя в группу
securityadmin.
use master
go
grant execute on xp_readerrorlog to [Ваш юзер]
go
Ещё, как вариант, я могу предложить воспользоваться ещё одной самописной утилитой для работы с журналом, о которой я писал раньше -
http://t-sql.ru/post/LogsViewer.aspx