我正在研究 ssrs 2008 r2,我正在使用关系数据库作为源构建报表模型。我有很多数据库,它们都具有相同的结构(相同的表和相同的表字段)。从报表模型的第一眼看,所有实体都是从数据源视图生成的。因此,它不允许一个报表模型与多个数据库一起使用。是否有多个数据库使用相同的报告模型?Ps:我的报表模型有这么多实体,对于每一个,我都必须对其进行编辑。所以你可以看到我需要的是自动化这个过程。
1 回答
我很想看到这个问题的答案,因为我对继承的产品有同样的要求。但是由于您没有任何其他答案,如果我描述我们拥有的设置,这可能会有所帮助。
初始部署
在本地,我们有一个Visual Studio 2008 (BIDS) 报表模型项目,其中包含一个数据源、多个数据源视图和报表模型。每次新数据库上线时,我们都会更改数据源的连接字符串,并更新项目的部署配置,以针对不同的报表服务器文件夹,格式为/Models/<databaseName>
. 然后使用 BIDS 部署模型。这种情况的频率很低,每两个月才发生一次。如果我们必须同时设置很多数据库,这将是一个缓慢而痛苦的过程。作为旁注,我们通过配置每个报告文件夹(即<databaseName>
文件夹)的安全性来限制对每个已部署模型的访问。
模型更新
由于我们最初的部署是手动的,以同样的方式更新模型会非常痛苦。所以我写了一个工具,它利用 SSRS 提供的 Web 服务来刷新我们部署的模型。在高层次上,这是如何工作的;在对 BIDS 项目中的报告模型进行更改后(请记住,我们只有一个项目,而不是每个已部署模型的项目),工具循环每个数据库并调用SetModelDefinition Web 服务方法,传入我们更新的模型文件。我们不会更改数据源,因此报表服务器上的更新模型将继续使用其配置的数据源。同样,这仅有效,因为每个数据库的数据源名称都不会更改。
作为参考,这里是该工具bulk
上传模型的示例 C# 代码
// prepare the model for upload
string pathToSmdlFile = "c:\ReportModel.smdl";
string pathToDataSourceViewFile = "c:\ReportModel.dsv";
string semanticModel = System.IO.File.ReadAllText(pathToSmdlFile);
string dataSourceView = System.IO.File.ReadAllText(pathToDataSourceViewFile);
// combine the semanticModel and dataSourceView, BIDS does when you use the `deploy` action
// because we're doing this in code we have to combine
byte[] model = Encoding.UTF8.GetBytes(semanticModel.Replace("</SemanticModel>", dataSourceView + "\n</SemanticModel>"));
// upload model using web service
using (var rs = new ReportingService2005WS.ReportingService2005())
{
rs.Url = "http://yourserver/ReportServer/ReportService2005.asmx";
rs.Credentials = new System.Net.NetworkCredential("admin", "password");
foreach (string databaseName in GetDatabaseNames())
{
string fullpath = string.Format("/Models/{0}/ReportModel", databaseName);
rs.SetModelDefinition(fullpath, model);
}
}
我并不是说这是完美的设置——我实际上认为我应该可以一次上传报告模型,并在使用报告时更改数据源。也许可以根据使用的 SSRS 登录配置不同数据源的使用。未能报告本身应该以某种方式传递要使用的正确数据源的详细信息(或连接字符串)。另一方面,这确实意味着我们的用户不必知道与数据库的连接的详细信息。我们只是给他们 SSRS 登录名并允许他们使用报告生成器进行构建;由于应用于每个数据库文件夹的安全性,它们被限制在数据库中......