通过SQL Server代理作业通过控制台应用程序执行SSRS报告

时间:2018-07-18 00:42:35

标签: sql-server reporting-services ssis ssrs-2012 sql-agent

我有一个SSRS解决方案,其中包含20个报告,所有报告都利用一个称为“ DataWarehouse”的共享数据源。此数据源已配置为使用Windows身份验证。这些报告已部署到服务器。

我有一个要求,一旦数据仓库在一夜之间完成加载,就需要能够自动运行这些报告。有时仓库负载可能需要5个小时,有时可能需要10个小时,所以我不想使用报表服务在特定时间安排这些报表,我希望仓库负载确定何时完成并触发报表。

现在,我有一种机制可以做到这一点:

  1. 我编写了一个c#控制台应用程序,该应用程序接受一个报告名称和一个运行该报告并将其保存在所需位置的文件路径。
  2. 我有一个SSIS软件包,可以从(i)执行控制台应用程序。我使用SSIS包,因为我工作的DBA不会启用xp_cmdshell。
  3. 我有一个代理作业,在仓库装载完成时运行SSIS软件包。

现在,如果我(在我自己的本地计算机上)运行SSIS包,则该包将成功执行,并生成并保存报告。当我将SSIS包部署到服务器并尝试通过代理作业运行它时,它失败并显示以下错误:

System.Web.Services.Protocols.SoapException: The permissions granted to user 'NT SERVICE\SQLSERVERAGENT' are insufficient for performing this operation. ---> Microsoft.ReportingServices.Diagnostics.Utilities.AccessDeniedException: The permissions granted to user 'NT SERVICE\SQLSERVERAGENT' are insufficient for performing this operation.
   at Microsoft.ReportingServices.Library.ReportExecution2005Impl.LoadReport (String Report, String HistoryID, ExecutionInfo2& executionInfo)
   at Microsoft.ReportingServices.WebServer.ReportExecutionService.LoadReport (String Report, String HistoryID, ExecutionInfo& executionInfo)

我最初的猜测是,这意味着SSIS作业将以“ NT SERVICE \ SQLSERVERAGENT”的身份执行,并且该用户无权在报表服务器上运行报表。因此,我跳到报表服务器并尝试将NT SERVICE \ SQLSERVERAGENT添加为可以运行报表的用户,但仍然出现错误。有人可以帮我弄清楚如何使它正常工作吗? 谢谢

2 个答案:

答案 0 :(得分:1)

这将帮助您在命令提示符下执行SSIS程序包,并且可以在批处理文件中的计划任务中在服务器上运行该程序包(您可能需要特殊权限才能在计划任务中运行批处理文件)。您将要做的是创建一个Windows批处理文件,以允许您通过命令提示符自动运行SSIS包,并且您将需要使用Dtexec。这是您的批处理文件的外观:

@ECHO OFF
Some comment about what the package is doing

Dtexec /f "C:\some\file\path\YourPackage.dtsx

然后,将记事本另存为Windows批处理文件后,便可以打开该批处理文件,它将在命令提示符下运行您的程序包。希望对您有帮助

答案 1 :(得分:0)

我编辑了控制台应用程序,以特定用户身份连接到SSRS服务器。我添加了以下内容,以防它对其他人有用。

为此,我创建了一个名为account.config的文件,该文件仅在第一行包含用户名,在第二行包含密码:

CREATE TRIGGER before_insert_on_blacklisted_ips BEFORE INSERT ON blacklisted_ips 
FOR EACH ROW
  SET NEW.allowed=NOW()+INTERVAL 1 HOUR;

然后在我的控制台应用程序中,我有以下代码:

MyUser
MyPassword