使用.NET代码在SSRS中执行粒度数据访问

问题描述:

以下是一个问题,我和我的团队一直在互联网寻求帮助,但收效甚微。这听起来像(在我们的想法中)一个共同的情况,并且对最佳方法进行调整可能对许多人非常有用。使用.NET代码在SSRS中执行粒度数据访问

我们有一个ASP.NET应用程序,它使用.NET代码在相当细致的级别控制数据访问。也就是说,我们有一个用户表,一个角色表,安全表,工作流表,以及大量的业务数据表。最终用户可以高度配置对业务数据的访问,因为他们可以直接在应用程序中自行管理用户帐户和安全。我们的.NET C#代码确定特定请求有权访问哪些数据(基于Windows登录)并提供。使用SQL Server登录名/角色没有相关的业务安全性。

因此,如何将SSRS实施到使用.NET代码以编程方式强制执行关系数据中定义的数据访问的系统中?

我们认为我们的解决方案将类似于下列之一:

[SSRS报告]> [数据源]>控制数据访问我们的.NET代码> [SQL服务器]
...或者。 ..
[SSRS报告]>控制数据访问我们的.NET代码> [数据源]> [SQL服务器]

如果这是正确的,那么什么样的技术或概念,我们错过让这个可能吗?

任何解决方案应该满足这些关键要求:

  1. 企业电力用户(报告创建者)应该能够创建使用报表生成器3.0 SSRS报告。他们仍然可以使用数据集设计视图和查询设计器来处理业务数据和关系。
  2. 业务高级用户(报告创建者)不应该在他们的报告或数据查询中实施数据访问。他们只需要担心报表设计。
  3. 访问报表的最终用户(报表使用者)将根据其特定访问级别在其报表中获取过滤数据(由.NET代码完成)。

当然还有其他人使用.NET代码来管理数据访问 - 在这种情况下SSRS不是一种选择吗?

谢谢!

SSRS运行良好,因为它非常接近数据库。试图在数据库和本身之间插入一个.NET层不会很好。

在数据库中有用户,角色和安全表,对于Windows用户有SSRS will tell you User!UserID。如果你愿意重新实现你的数据访问逻辑,你可以编写一个T/SQL存储过程,接受UserID作为参数并过滤返回的数据。存储过程是报表的数据集。

让业务用户有能力创建自己的报表将会更加困难。您可以通过实施一系列存储过程来实现这一点,这些存储过程返回一般数据集以供这些超级用户在构建报告时使用。然后这些过程作为针对基础表数据的过滤视图。当报告使用者运行结果报告时,他们将看到根据其自己的用户ID过滤的数据。

对于我们的ASP.Net MVC应用程序,REST风格的Web服务将XML或JSON数据传递回前端应用程序,我们也有类似的情况。

对于报告,我们想调用这些相同的控制器来获取相同的数据。幸运的是,SSRS具有惊人的可扩展性。我创建了一个调用我们的ASP.Net MVC控制器的custom data processing extension,并将反序列化的数据返回到数据集以供报告使用。

我的查询则是这样的:

Action=SomeAction;Controller=ControllerName;DtoType=List<MyDto> 

虽然不是小事,它像你想象和实现自定义数据处理扩展是来解决问题的好办法并不难。网上有很多例子可以帮助你入门。

+0

谢谢克里斯,这真的很有帮助。你对演出有任何评论吗?使用数据处理扩展在检索数据时是否存在成本/开销? – tibor 2013-05-09 14:00:27

+0

我发现性能相当不错。反序列化数据不会增加太多的开销。关键是Web服务的性能。如果.Net代码返回的数据已经结构良好 - XML或JSON - 那么你应该没有问题。 – 2013-05-10 00:00:43