SSRS: ошибка настройки подписки/рассылки отчётов после переноса сервера

После переноса Microsoft SQL Server Reporting Services работает - отчёты создаются.

Но стоит перейти к настройкам подписки/рассылки отчётов в административном разделе, как мы получаем интересное сообщение: В базе данных сервера отчетов произошла ошибка. Это могло произойти из-за ошибки соединения, истечения времени ожидания или недостатка места на диске с базой данных. (rsReportServerDatabaseError)

В базе данных сервера отчетов произошла ошибка...

На редкость информативное сообщение обязывает заглянуть в логи SSRS, где расскрываются подробности произошедшего:

library!ReportServer_0-14!13e8!04/07/2011-17:42:40:: Call to GetSystemPermissionsAction().
library!ReportServer_0-14!13e8!04/07/2011-17:42:40:: Call to ListSchedulesAction().
library!ReportServer_0-14!13e8!04/07/2011-17:42:40:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: , В базе данных сервера отчетов произошла ошибка. Это могло произойти из-за ошибки соединения, истечения времени ожидания или недостатка места на диске с базой данных.;
library!ReportServer_0-14!13e8!04/07/2011-17:42:40:: e ERROR: Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: В базе данных сервера отчетов произошла ошибка. Это могло произойти из-за ошибки соединения, истечения времени ожидания или недостатка места на диске с базой данных. ---> System.Data.SqlClient.SqlException: The EXECUTE permission was denied on the object 'xp_sqlagent_notify', database 'mssqlsystemresource', schema 'sys'.
   в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   в System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   в System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
   в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   в Microsoft.ReportingServices.Library.InstrumentedSqlCommand.b__0()
   в Microsoft.ReportingServices.Library.SqlBoundaryWithReturn`1.Invoke(Method m)
   --- Конец трассировки внутреннего стека исключений ---
   в Microsoft.ReportingServices.Library.Storage.WrapAndThrowKnownExceptionTypes(Exception e)
   в Microsoft.ReportingServices.Library.SqlBoundaryWithReturn`1.Invoke(Method m)
   в Microsoft.ReportingServices.Library.SqlAgentScheduler.get_IsSchedulerRunning()
   в Microsoft.ReportingServices.Library.SchedulingDBInterface.CheckIfSchedulerIsRunning(Boolean error)
   в Microsoft.ReportingServices.Library.SchedulingDBInterface.ListTasks(CatalogItemPath path)
   в Microsoft.ReportingServices.Library.ScheduleCoordinator.ListTasksAsArray(ExternalItemPath externalPath)
   в Microsoft.ReportingServices.Library.ListSchedulesAction.PerformActionNow()
   в Microsoft.ReportingServices.Library.RSSoapAction`1.Execute()
ui!ReportManager_0-15!1298!04/07/2011-17:42:40:: e ERROR: System.Web.Services.Protocols.SoapException: В базе данных сервера отчетов произошла ошибка. Это могло произойти из-за ошибки соединения, истечения времени ожидания или недостатка места на диске с базой данных. ---> Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: В базе данных сервера отчетов произошла ошибка. Это могло произойти из-за ошибки соединения, истечения времени ожидания или недостатка места на диске с базой данных. ---> System.Exception: Чтобы получить дополнительные сведения об этой ошибке, перейдите к серверу отчетов на локальном сервере или включите удаленный контроль ошибок
   в Microsoft.ReportingServices.UI.ScheduleItems.LoadItems()
   в Microsoft.ReportingServices.UI.SortableItems.Control_Init(Object sender, EventArgs args)
   в System.EventHandler.Invoke(Object sender, EventArgs e)
   в System.Web.UI.Control.OnInit(EventArgs e)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.AddedControl(Control control, Int32 index)
   в Microsoft.ReportingServices.UI.SubTabs.Control_Init(Object sender, EventArgs args)
   в System.EventHandler.Invoke(Object sender, EventArgs e)
   в System.Web.UI.Control.OnInit(EventArgs e)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.AddedControl(Control control, Int32 index)
   в Microsoft.ReportingServices.UI.SettingsPage.Control_Init(Object sender, EventArgs e)
   в System.EventHandler.Invoke(Object sender, EventArgs e)
   в System.Web.UI.Control.OnInit(EventArgs e)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.AddedControl(Control control, Int32 index)
   в Microsoft.ReportingServices.UI.SharedArea.Control_Init(Object sender, EventArgs args)
   в System.EventHandler.Invoke(Object sender, EventArgs e)
   в System.Web.UI.Control.OnInit(EventArgs e)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Control.AddedControl(Control control, Int32 index)
   в Microsoft.ReportingServices.UI.Pages.Settings.Page_Init(Object sender, EventArgs e)
   в System.EventHandler.Invoke(Object sender, EventArgs e)
   в System.Web.UI.Control.OnInit(EventArgs e)
   в System.Web.UI.Page.OnInit(EventArgs e)
   в System.Web.UI.Control.InitRecursive(Control namingContainer)
   в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
ui!ReportManager_0-15!1298!04/07/2011-17:42:40:: e ERROR: HTTP status code --> 200
-------Details--------
System.Web.Services.Protocols.SoapException: В базе данных сервера отчетов произошла ошибка. Это могло произойти из-за ошибки соединения, истечения времени ожидания или недостатка места на диске с базой данных. ---> Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: В базе данных сервера отчетов произошла ошибка. Это могло произойти из-за ошибки соединения, истечения времени ожидания или недостатка места на диске с базой данных. ---> System.Exception: Чтобы получить дополнительные сведения об этой ошибке, перейдите к серверу отчетов на локальном сервере или включите удаленный контроль ошибок   в Microsoft.ReportingServices.UI.ScheduleItems.LoadItems()   в Microsoft.ReportingServices.UI.SortableItems.Control_Init(Object sender, EventArgs args)   в System.EventHandler.Invoke(Object sender, EventArgs e)   в System.Web.UI.Control.OnInit(EventArgs e)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.AddedControl(Control control, Int32 index)   в Microsoft.ReportingServices.UI.SubTabs.Control_Init(Object sender, EventArgs args)   в System.EventHandler.Invoke(Object sender, EventArgs e)   в System.Web.UI.Control.OnInit(EventArgs e)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.AddedControl(Control control, Int32 index)   в Microsoft.ReportingServices.UI.SettingsPage.Control_Init(Object sender, EventArgs e)   в System.EventHandler.Invoke(Object sender, EventArgs e)   в System.Web.UI.Control.OnInit(EventArgs e)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.AddedControl(Control control, Int32 index)   в Microsoft.ReportingServices.UI.SharedArea.Control_Init(Object sender, EventArgs args)   в System.EventHandler.Invoke(Object sender, EventArgs e)   в System.Web.UI.Control.OnInit(EventArgs e)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Control.AddedControl(Control control, Int32 index)   в Microsoft.ReportingServices.UI.Pages.Settings.Page_Init(Object sender, EventArgs e)   в System.EventHandler.Invoke(Object sender, EventArgs e)   в System.Web.UI.Control.OnInit(EventArgs e)   в System.Web.UI.Page.OnInit(EventArgs e)   в System.Web.UI.Control.InitRecursive(Control namingContainer)   в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
library!ReportServer_0-14!13e8!04/07/2011-17:42:40:: Call to GetSystemPropertiesAction().
ui!ReportManager_0-15!1298!04/07/2011-17:42:40:: e ERROR: System.Threading.ThreadAbortException: Поток находился в процессе прерывания.
   в System.Threading.Thread.AbortInternal()
   в System.Threading.Thread.Abort(Object stateInfo)
   в System.Web.HttpResponse.End()
   в Microsoft.ReportingServices.UI.ReportingPage.ShowErrorPage(String errMsg)

Трассировка SQL-сервера также выдала это сообщение:

SQL Server Profiler

Идём на исходный сервер (с которого был перенесён SSRS), проверяем права на указанный объект:

Путь к объектам

xp_sqlagent_notify EXECUTE permission

А теперь проверяем новый сервер (куда перенесли службу серера отчётов):

xp_sqlagent_notify

Невооружённым взглядом видно, что необходимые разрешения для роли RSExecRole отсутствуют, и, как раз вовремя, находим статью How to: Create the RSExecRole.

Осталось только раздать недостающие права. Сделать это можно вручную, как описанно в статье приведённой чуть выше, либо выполнить следующий запрос:

USE master
GO

GRANT EXECUTE ON master.dbo.xp_sqlagent_notify TO RSExecRole
GO

GRANT EXECUTE ON master.dbo.xp_sqlagent_enum_jobs TO RSExecRole
GO

GRANT EXECUTE ON master.dbo.xp_sqlagent_is_starting TO RSExecRole
GO


-- Permissions for SQL Agent SP's
USE msdb
GO

GRANT EXECUTE ON msdb.dbo.sp_help_category TO RSExecRole
GO

GRANT EXECUTE ON msdb.dbo.sp_add_category TO RSExecRole
GO

GRANT EXECUTE ON msdb.dbo.sp_add_job TO RSExecRole
GO

GRANT EXECUTE ON msdb.dbo.sp_add_jobserver TO RSExecRole
GO

GRANT EXECUTE ON msdb.dbo.sp_add_jobstep TO RSExecRole
GO

GRANT EXECUTE ON msdb.dbo.sp_add_jobschedule TO RSExecRole
GO

GRANT EXECUTE ON msdb.dbo.sp_help_job TO RSExecRole
GO

GRANT EXECUTE ON msdb.dbo.sp_delete_job TO RSExecRole
GO

GRANT EXECUTE ON msdb.dbo.sp_help_jobschedule TO RSExecRole
GO

GRANT EXECUTE ON msdb.dbo.sp_verify_job_identifiers TO RSExecRole
GO

GRANT SELECT ON msdb.dbo.sysjobs TO RSExecRole
GO

GRANT SELECT ON msdb.dbo.syscategories TO RSExecRole
GO

via http://sqlserver-qa.net/blogs/bi/archive/2008/05/27/execute-permission-d...

С этим случаем покончено. Сейчас ещё напишу про разворачивание Microsoft SQL Server Reporting Services на NLB-кластере и успокоюсь на сегодня : )

Русский
field_vote: 
4
Average: 4 (25 votes)

Добавить комментарий