Reporting services SQL Server Reporting Services,如何最好地应用筛选器
我有一堆记录订单,我想让用户可以从中生成报告 用户来自不同的部门,我想让它,所以每个部门只能看到自己的东西 我不知道该怎么做才对 我现在得到的是: -我在订单表上放置过滤器的模型 过滤器可以使用GetUserID来获取用户名,但我不知道如何从中获取将用户映射到特定部门的UserDepartment表Reporting services SQL Server Reporting Services,如何最好地应用筛选器,reporting-services,filter,Reporting Services,Filter,我有一堆记录订单,我想让用户可以从中生成报告 用户来自不同的部门,我想让它,所以每个部门只能看到自己的东西 我不知道该怎么做才对 我现在得到的是: -我在订单表上放置过滤器的模型 过滤器可以使用GetUserID来获取用户名,但我不知道如何从中获取将用户映射到特定部门的UserDepartment表 CREATE FUNCTION [dbo].[fn_GetUserDepartmentAllocations] ( @UserName NVARCHAR(100) ) RETURNS
CREATE FUNCTION [dbo].[fn_GetUserDepartmentAllocations]
(
@UserName NVARCHAR(100)
)
RETURNS
@TempPermissions TABLE
(
DepartmentId Int
)
AS
BEGIN
INSERT INTO @TempPermissions
SELECT DepartmentId
FROM DepartmentPermissions
WHERE DepartmentAllowedUsername = @UserName
RETURN
END
当然,我更喜欢一种解决方案,这样我就不必为每个部门创建新的访问组或编辑可能有人设想的模型
有什么线索吗
使用SQLServer2008
编辑:这个链接显示了我试图做的基本内容,但作者似乎认为每个记录都有一个可以匹配的用户名字段
在我的情况下,我希望X部门的所有用户都能访问该行。这假设用户有订单。 因此,按与筛选用户位于同一部门的用户进行筛选。不要直接过滤订单 我已经猜到了模式和列名:hoep,你明白了
SELECT
MY STuff
FROM
Order O
JOIN
UserDept UD ON O.UserCode = UD.UserCode
WHERE
EXISTS (SELECT *
FROM
UserDept UD2
WHERE
UD2.UserCode = @MYUSerCode
AND
UD2.DeptID = UD.DeptID)
--or
SELECT
MY STuff
FROM
Order O
JOIN
UserDept D ON O.UserCode = D.UserCode
JOIN
UserDept U ON D.DeptID = U.DeptID
WHERE
U.UserCode = @MYUSerCode
使用GetUserID方法很难实现您想要实现的目标。要使用源查询必须返回大量冗余数据,请设想如下情况:
/*
Table: User
Fields: UserID, LoginName, FullName
Table: Department
Fields: DepartmentID, Name
Table: UserDepartments
Fields: UserID, DepartmentID
Table: Order
Fields: OrderNumber, DepartmentID
*/
SELECT O.OrderNumber, O.DepartmentID, U.LoginName
FROM Order O
JOIN Department D ON D.DepartmentID = O.DepartmentID
JOIN UserDepartments UD ON UD.DepartmentID = D.DepartmentID
JOIN User U ON U.UserID = UD.UserID
这将为您提供比您想要的更多的行,基本上是订单拥有部门中每个用户的订单副本
现在,您可以按照提供的链接中所述应用过滤器。如果当前用户在正确的部门,这会将其筛选为当前用户订单行的一个副本
如果这是一个性能问题,还有其他选择,最简单的方法是在ASP.NET、WinForms或WPF中使用本地report.RDLC,并将用户详细信息传递给数据调用,以便可以在SQL中进行过滤。我们遇到了类似的问题,并最终在SQL中编写了一个函数 该函数执行了以下操作:
/*
Table: User
Fields: UserID, LoginName, FullName
Table: Department
Fields: DepartmentID, Name
Table: UserDepartments
Fields: UserID, DepartmentID
Table: Order
Fields: OrderNumber, DepartmentID
*/
SELECT O.OrderNumber, O.DepartmentID, U.LoginName
FROM Order O
JOIN Department D ON D.DepartmentID = O.DepartmentID
JOIN UserDepartments UD ON UD.DepartmentID = D.DepartmentID
JOIN User U ON U.UserID = UD.UserID
从SRSS收到用户名参数
在权限表上执行了查找,并在您的案例中检索了记录部门Id。
返回部门Id的
然后我们的sql语句如下所示:
选择*
来自重要数据
其中DepartmentId在SELECT Id FROM fn中_GetUserDepartmentAllocations@UserName
这确实迫使我们修改所有sql查询,但它允许我们用最少的复杂逻辑来完成
这允许的另一件事是,如果您有一个超越部门边界的用户:例如,一个两个部门的经理
CREATE FUNCTION [dbo].[fn_GetUserDepartmentAllocations]
(
@UserName NVARCHAR(100)
)
RETURNS
@TempPermissions TABLE
(
DepartmentId Int
)
AS
BEGIN
INSERT INTO @TempPermissions
SELECT DepartmentId
FROM DepartmentPermissions
WHERE DepartmentAllowedUsername = @UserName
RETURN
END
这样做的主要好处是,它还允许您编辑一个位置来更改整个权限结构,您不必查看每个报告来更改它,而是更改一个位置
例如,你可以有一个经理,他隶属于两个部门,但除了星期四之外,他不允许查看这些部门。我知道一个愚蠢的例子,但你希望能理解这一点
希望这有帮助
Pete用户/userdepartment和订单之间的链接是什么?每个订单都有一个部门ID,指向拥有订单的部门。当您为SRS创建模型时,您可以向模型添加过滤器和字段,然后在幕后创建自己的SQL。这是同一件事吗?我担心如果我使用SQL来定义数据源,我将无法使用模型的GetUserID。对不起,我没有在SSRS中使用模型。当然这是数据函数:基于集合的联接/筛选,而不是在报表本身中执行的操作?@Soraz:您仍然可以将用户id作为参数传递给数据源,对吗?真的不确定。当您说在VisualStudio中创建模型时,它几乎可以独立完成所有工作。我不确定在哪里实现这些基于sql的方法。