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

Executing SSRS report via a console application though a SQL Server Agent job

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

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

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

  1. 我已经编写了一个 c# 控制台应用程序,它接受一个报告名称和一个文件路径,运行 将报告保存在需要的地方。
  2. 我有一个从 (i) 执行控制台应用程序的 SSIS 程序包。我使用 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 添加为可以 运行 报告的用户,但我仍然遇到错误。任何人都可以帮我弄清楚如何使它正常工作吗? 谢谢

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

@ECHO OFF
Some comment about what the package is doing

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

然后,一旦您将记事本另存为 windows 批处理文件,您就可以打开该批处理文件,它将 运行 您的包显示在命令提示符中。希望对您有所帮助

我编辑了控制台应用程序以作为特定用户连接到 SSRS 服务器。我在下面添加了我所做的,以防它对其他人有用。

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

MyUser
MyPassword

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

// Read in the config file and add the lines to a list
List<string> accountDetails = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "account.config")).ToList();

ReportExecutionService myReportExecutionService = new ReportExecutionService();

// Add the credentials
// accountDetails[0] is the username, accountDetails[1] is the password
myReportExecutionService.Credentials = new NetworkCredential(accountDetails[0], accountDetails[1]);