Permissions

在 SSRS 中執行訂閱的權限

  • December 23, 2016

我想在完成需要不同時間的 SSIS 包執行的一些 ETL 工作後執行 SSRS 訂閱。我正在考慮使用這種方法,它基本上由 SSIS 呼叫與訂閱的 SQL Server 代理作業呼叫以執行訂閱相同的儲存過程組成。

但是,我不確定管理執行訂閱的權限的最佳方式是什麼。例如,我不願意將使用者添加到 中,RsExecRole因為 Microsoft 在某些文件中不鼓勵這樣做,並且我不願意授予對象級權限來執行該ReportServer.ado.AddEvent過程,因為它們可能會在任何遷移中被忽略。(編輯:我想我們可以通過執行代理作業而不是呼叫儲存過程來解決這個問題。)

我還希望避免在其中一個 GUID 更改時執行訂閱中斷的程式碼出現問題。

SSRS 專業人員如何管理此類請求的權限?或者,是否有更簡單的方法可以繞過這些問題?

如果您使用一次性計劃設置報告訂閱並收集其計劃 ID,則可以使用 sp_start_job 執行它。SSRS 使用 SQL Server 代理管理訂閱,無需使用報告伺服器事件即可實現這一點。執行使用者,我想是一個服務帳戶,只需要成為 SQLAgentOperatorRole 的一部分。請參閱:sp_start_job#permissions

您在問題的編輯中提到了這一點,但我想概述該過程,以防其他人需要特定的解決方案。

設置時間表很容易。預設時間是您設置訂閱計劃的當天凌晨 2 點,並且可能已經過去,因此您可以離開它。

然後您可以通過查詢報表伺服器數據庫表來收集您的計劃 ID:訂閱編輯頁面,選擇計劃

select C.Name ReportName,
   S.Name ScheduleName,
   SU.Description SubscriptionName,
   S.ScheduleID
from ssrs.Catalog C
join ssrs.ReportSchedule RS
   on C.itemID = RS.ReportID
join ssrs.Schedule S
   on RS.scheduleID = S.ScheduleID
join ssrs.Subscriptions SU
   on RS.SubscriptionID = SU.SubscriptionID
where C.name = 'Test Report'

(1 row(s) affected)

報表伺服器數據庫表

您可以通過引用與您的計劃 ID 匹配的作業名稱來啟動訂閱:

SQL 作業

/*Run Subscription*/
exec msdb.dbo.sp_start_job '8037A345-9F7C-45B0-99FB-B110996BD521'

(1 row(s) affected)
Job '8037A345-9F7C-45B0-99FB-B110996BD521' started successfully.

我還沒有遇到計劃 ID (GUID) 更改和中斷執行的問題,但作為故障保險,您可以創建數據驅動訂閱並明確聲明唯一描述。

數據驅動訂閱第 1 步

然後,您可以參考描述以動態收集您的計劃 ID。

declare @ScheduleID uniqueidentifier

select @ScheduleID = S.ScheduleID
from ssrs.Catalog C
join ssrs.ReportSchedule RS
   on C.itemID = RS.ReportID
join ssrs.Schedule S
   on RS.scheduleid = S.ScheduleID
join ssrs.Subscriptions SU
   on RS.SubscriptionID = SU.SubscriptionID
where C.name = 'Test Report'
   and SU.Description = 'My Test Report Subscription'

exec msdb.dbo.sp_start_job @ScheduleID

(1 row(s) affected)
Job '8037A345-9F7C-45B0-99FB-B110996BD521' started successfully.

引用自:https://dba.stackexchange.com/questions/96445