После переноса 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-сервера также выдала это сообщение:

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


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

Невооружённым взглядом видно, что необходимые разрешения для роли 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-кластере и успокоюсь на сегодня : )
Добавить комментарий