Sql server 在TSQL中处理安全性

Sql server 在TSQL中处理安全性,sql-server,tsql,reporting-services,Sql Server,Tsql,Reporting Services,在SSRS中执行一些行级安全性是一个挑战,这涉及到运行一些SQL逻辑来根据简单的安全模型过滤返回的结果集 我选择当前用户的用户名并将其与部门列表相匹配。每个用户只能在其审批路径上看到部门。这个钻头很容易,工作很好 金融业务领域有许多用户,这些用户需要绕过安全模型,查看每个部门。此查询只选择每个部门,而不考虑当前用户 我的问题是,如何选择性地将两者都包括在内,以便财务用户可以看到所有内容,而其他人只能看到自己的部门 从表面上看,这听起来很简单,但我正在努力想出最好、最简单的方法,我的搜索结果一无所

在SSRS中执行一些行级安全性是一个挑战,这涉及到运行一些SQL逻辑来根据简单的安全模型过滤返回的结果集

  • 我选择当前用户的用户名并将其与部门列表相匹配。每个用户只能在其审批路径上看到部门。这个钻头很容易,工作很好

  • 金融业务领域有许多用户,这些用户需要绕过安全模型,查看每个部门。此查询只选择每个部门,而不考虑当前用户

  • 我的问题是,如何选择性地将两者都包括在内,以便财务用户可以看到所有内容,而其他人只能看到自己的部门

    从表面上看,这听起来很简单,但我正在努力想出最好、最简单的方法,我的搜索结果一无所获,因为很难知道向谷歌提出正确的问题,等等

    解决方案可以在数据查询或SSRS本身中完成,但我不能返回并修改数据库-我必须使用我所拥有的

    数据结构的简要概述

    用户
    表有
    用户id
    部门
    部门
    表有
    部门
    业务区域

    财务是一个包含许多部门的业务领域

    任何拥有汇总到财务部门的部门的用户都必须能够查看所有部门和业务领域


    我希望这足够彻底,有人能给我一个正确的方向。它可能正盯着我看,但我有很大的时间压力,所以不能永远花在它上面。谢谢

    好的,我似乎已经用一段SQL破解了它,它给了我想要的结果。也许有其他的,或者更好的方法来实现这一点,但这里是我的解决方案

    select distinct table.col1, table,col2  
      from table 
      join user 
        on ( user.ID = 'userone' and department.area = 'finance' )
        or ( user.ID = 'userone' and department.dept = user.dept' )
    
    SELECT DISTINCT u.user, d.department
    FROM department d
    JOIN user u ON 
     CASE
      WHEN u.user = @UserId AND u.user NOT IN (SELECT u.user FROM user u JOIN department d ON u.dept = d.dept WHERE d.bus_area = 'Finance') AND u.dept = d.dept THEN 1
      WHEN u.user = @UserId AND u.user IN (SELECT u.user FROM user u JOIN department d ON u.dept = d.dept WHERE d.bus_area = 'Finance') AND d.dept IS NOT NULL THEN 1 
      ELSE 0 
     END = 1;
    

    如果有人可以改进它,请随意。

    最简单的方法是创建一个UserDepartment表,并在添加财务用户时简单地添加所有部门。并对其进行设置,以便department表具有向所有财务用户添加任何新部门的触发器


    这使得查询变得非常简单,如果以后需要,您可以灵活地添加其他用户,这些用户可以查看其部门以外的内容。它还避免了使用复杂逻辑条件或条件的各种性能不佳的查询。

    在SSRS中有一种非常简单的处理方法

    报告中有两个数据集。没有任何过滤器的。还有一个是有限制的,在

    username = @CurrentUserName
    
    您可以使用
    选择SUSER\u NAME()
    获取当前用户的用户名。将其存储在参数
    @CurrentUserName

    在同一位置有两个表,来源于上面的两个数据集

    对于下一部分,您需要了解SSR中的“隐藏”属性。
    查找当前用户名。如果它属于“Finance”,则不受任何限制地显示该表,并隐藏另一个表。如果不是,则隐藏第一个表并显示第二个(已过滤)表

    您需要解释如何实现行级安全性。是否每一行都有一个“部门”在里面,而你正在过滤它?执行可选筛选的常用方法是使用
    和(row.department=User.department)以及(
    和(row.department=User.department或User.department='Finance')和……
    。这似乎很模糊,但您需要发布更多关于如何设置行级安全性的信息。Thx。和那有点不同。除了看到每个部门的财务用户之外,所有用户都可以看到“他们的”部门(每一行都有用户和部门)。我只是在下拉列表中显示一个部门列表,供他们选择。这方面的伪代码类似于。。。如果localvarUserId在(selectuserid where Bus Area=Finance)中,那么选择所有部门,否则选择userid=localvarUserId的部门,我正在努力为它找到SQL。这正是SQL所做的。Thx用于输入,但不是。很接近,但不完全正确。由于两个原因-财务的公交区域在部门表上。不是用户表。还有一些未映射到用户的部门仍然需要显示。这些数据不会随此SQL一起返回。我在下面提出了一个可行的解决方案,它看起来有点凌乱,但可以在一秒钟内为所有用户返回正确的结果。然后只需将表更改为departmetThx,但我没有返回数据库设计的奢侈。我必须生成一段SQL或一些SSRS逻辑,以仅使用tables.Thx中当前可用的内容来实现它。我曾想过类似的事情,但我有很多报告,有些太复杂了,不可能实现。不过,对于一个简单的视图来说,这是可行的。你的问题没有说明这一点。不管怎样,您是否尝试过使用expression在报表数据集上添加过滤器,expression可以进行自定义过滤?