使用.net代码在SSRS中强制粒度数据访问
本文关键字:粒度 数据 访问 net 代码 SSRS 使用 | 更新日期: 2023-09-27 18:12:31
有一个问题,我和我的团队一直在网上寻找帮助,但收效甚微。这听起来像是(在我们的脑海中)一种常见的情况,专注于最佳方法可能对许多人都非常有用。
我们有ASP。.NET应用程序,它使用。NET代码在相当细粒度的级别上控制数据访问。也就是说,我们有一个用户表、一个角色表、安全表、工作流表,然后是许多业务数据表。最终用户可以高度配置对业务数据的访问,因为他们可以直接在应用程序中自我管理用户帐户和安全性。我们的。net c#代码决定特定请求有权获得哪些数据(基于Windows登录),并为其提供服务。使用SQL Server登录/角色没有相关的业务安全性。
那么,如何将SSRS实现到一个使用。net代码以编程方式执行关系数据中定义的数据访问的系统中呢?
我们认为我们的解决方案看起来像以下之一:
[SSRS Report]>[Datasource]>控制数据访问的。net代码>[SQL Server]
…或…
[SSRS报告]>控制数据访问的。net代码> [Datasource]> [SQL Server]
如果这是正确的,那么我们缺少什么技术或概念来实现这一目标?
任何解决方案都应该满足这些关键要求:
- 业务高级用户(报表创建者)应该能够使用report Builder 3.0创建SSRS报表。他们应该仍然能够使用数据集设计视图和查询设计器处理业务数据和关系。
- 业务高级用户(报表创建者)不应该在其报表或数据查询中实现数据访问。他们只需要担心报告的设计。
- 最终用户(报告消费者)访问报告,将根据其特定访问级别在报告中获得过滤数据(由。net代码完成)。
肯定有人在那里使用。net代码来管理数据访问——在这种情况下,SSRS不是一个选项吗?
谢谢!
我们的ASP也有类似的情况。Net MVC应用程序,其中RESTful web服务将XML或JSON数据传回前端应用程序。
对于报告,我们希望调用这些相同的控制器来获取相同的数据。幸运的是,SSRS具有惊人的可扩展性。我创建了一个自定义数据处理扩展,它调用我们的ASP。Net MVC控制器并返回数据,这些数据被反序列化为数据集以供报表使用。我的查询看起来像这样:
Action=SomeAction;Controller=ControllerName;DtoType=List<MyDto>
虽然不是微不足道的,但它并不像您想象的那么难,实现自定义数据处理扩展是解决问题的好方法。网上有很多例子可以帮你入门。
SSRS工作得很好,因为它离数据库很近。试图在数据库和自身之间插入。net层是不会很好地工作的。
数据库中有用户、角色和安全表,SSRS会告诉您user !Windows用户的UserID。如果您愿意重新实现您的数据访问逻辑,您可以编写一个T/SQL存储过程,它接受UserID作为参数并过滤返回的数据。存储过程是报告的数据集。
给业务高级用户创建他们自己的报表的能力会有点困难。您可以通过实现一系列存储过程来实现这一点,这些存储过程返回通用数据集,供这些高级用户在构建报告时使用。然后,这些过程作为针对底层表数据的过滤视图发挥作用。当报告使用者运行结果报告时,他们将看到根据自己的UserID过滤的数据。