我正在为SSRS 2008报告开发存储过程,但我想根据运行报告的用户的角色来限制数据输出。我该怎么做呢?我想要做的是检索Windows用户名并根据此过滤记录,但用户使用“sa”帐户登录服务器。所以现在我想我应该使用AD登录。
我还看到了如何在SSRS而不是T-SQL sproc中设置安全性,以便用户可以访问相应的文件夹。但是这第二种方法听起来更麻烦,因为我们有很多不同的报告,因为我希望用户能够访问所有报告,但只能访问数据的不同部分。
通过报表服务器上的SSRS组和文件夹或T-SQL sproc内部实现安全性是否更好?
我查看了“(= User.UserID)”解决方案的链接,但是在实现此问题时遇到了问题。我做了什么:我通过选择文本查询在SSRS中创建了一个数据集:
select people_id from people_rv where last_name like 'd%'
这将返回people_id的列表
然后,我创建了一个新参数,并将其设置为等于上述数据集的可用值。我将其设为Text数据类型并允许Null和Blank值。没有默认值。最后,我为tablix设置了可见性:
=iif(Parameters!staff_id.Value in (select people_id from users),1,0)
但这会产生错误。我怎样才能重新制定这个tablix表达式?
答案 0 :(得分:1)
无论用于访问数据源的方法如何,您仍然可以检索正在访问报告的用户ID(=User.UserID
)。将其设置为SSRS中的内部参数,然后您可以非常轻松地将安全性合并到您的查询中。
查看你的this question几分钟后提交的答案。
使用BIDS和SSRS 2008R2(2008应该相同)的更具体的实施细节
=User.UserID
为下一个参数创建数据集:创建一个仅列出该用户可用值的数据集。查询可能类似于:
SELECT
CategoryName,
CategoryID
FROM
Categories c
INNER JOIN
CategoryPermissions cp
ON c.ID = cp.CategoryID
INNER JOIN
Users u
ON cp.UserID = u.People_ID
WHERE u.WindowsAccount = @UserID
设置您将向用户显示的参数。它应该从上一步的查询中获取available values
。
设置主数据集。它应该使用步骤5中的参数值以及步骤4中的权限查询。例如:
SELECT
*
FROM
Products p
INNER JOIN
Categories c
ON p.CategoryID = c.ID
INNER JOIN
CategoryPermissions cp
ON c.ID = cp.CategoryID
INNER JOIN
Users u
ON cp.UserID = u.People_ID
WHERE u.WindowsAccount = @UserID
AND c.CategoryName in ( @Categories )
(此双重检查用户是否有权查看此类别。)