概括
我在 Azure 上使用 SQL Server Reporting Services。我想在运行时动态指定连接字符串,包括凭据。我通过在 ASPX 页面中嵌入 ReportViewer 控件来运行报告。
只要我在 SSRS 上指定执行帐户,我就可以使用 SSRS 2012 在本地完成这项工作。但是,在 Azure Reporting Services 上,我无法指定执行帐户,因此它不起作用。
我的问题是 - 我如何在 Azure 上进行这项工作?具体来说,在使用 Azure Reporting Services 而不是本地时,如何在运行时指定包括凭据在内的数据库连接字符串。
细节
当您在本地执行此操作时,这些是关键步骤;
- 将您的报告设置为使用嵌入式连接。
- 定义一个参数,比如“ConnectionString”
- 在您的嵌入式数据源中,将连接字符串设置为“[@ConnectionString]”(您也可以使用表达式构建器从不同的参数构造连接字符串,但区别相同)。
- 在您的嵌入式数据源中,将凭据设置为“不使用凭据”。
- 确保您已在 SSRS 上指定执行帐户
- 在您的 ASPX 页面中,执行类似的操作
this.ReportViewer1.ServerReport.SetParameters(new ReportParameter("ConnectionString", connectionString, false));
在 Azure 上的 SSRS 上,您无法指定执行帐户,因此上述方法不起作用。
本质上,如果您尝试设置“不使用凭据”并且您没有指定执行帐户,您将收到此错误:
当前操作无法完成。用户数据源凭证不符合要求。用户数据源凭据未存储在报表服务器数据库中,或者用户数据源配置为不需要凭据但未指定无人参与执行帐户。追踪 ID 为:XXX。机器名称是 XXX。(rsInvalidDataSourceCredentialSetting)
我试过的
到目前为止,我已经尝试了很多不同的方法,包括在嵌入式数据源中指定虚拟凭据。使用 Azure 进行这项工作的唯一方法是直接在嵌入式数据源中指定有效的数据库凭据。我还看到了一些关于尝试使用“SQL Server”类型连接字符串而不是“Azure SQL”的建议,但它似乎在本地没有任何不同,无论如何,我无法部署到 Azure,除非我将其设置为 Azure SQL。我也尝试过,this.ReportViewer1.ServerReport.SetDataSourceCredentials
但这似乎也无济于事;单步执行代码时,我第一次尝试与报告通信时遇到错误,即使该通信是尝试设置凭据的调用。
我对此感到最沮丧的是,这似乎是一种完全不合逻辑的依赖。您在嵌入式数据源中指定的数据库凭据不能用于实际运行报表(因为它们只是 SQL 凭据),并且执行帐户是无法访问数据库的 Windows 帐户。因此,它看起来像是一个完全任意的依赖关系,没有任何实际原因。