我为所有SQL Server 2008报告专家提供了一个脑筋急转弯: - )
我有一个显示大量数据的报告,包括用户的UserID和OrgUnitID。这是我在服务器上呈现的服务器报告,来自ASP.NET应用程序。
我的要求是
“普通”用户只能看到自己的数据行(基本上是
SELECT (fields) FROM dbo.DataView WHERE UserID = @UserID
)
特权用户可以看到他的所有下属;我有一个表值函数,可以提供该功能(基本上是SELECT (fields) FROM dbo.DataView
)
INNER JOIN dbo.OrgHierarchy ON DataView.OrgUnitID = OrgHierarchy.OrgUnitID
这两种情况本身都很好用 - 麻烦的是:我应该将它们合并为一份报告。
我该怎么做?如何根据我传入的报告参数(@UserLevel
; 0 =普通用户,1 =特权)动态生成报告,使用一个查询或另一个查询?
我真的不想进入动态重写SQL查询....任何其他想法??
我正在考虑拥有两个独立的不同数据集,然后根据UserLevel参数激活“正确”数据集 - 但我似乎无法找到如何在子报表上定义数据集或文本框......
然后我希望我能够从我的客户端应用程序动态地在我的服务器报告上添加一个过滤器到我的数据集 - 但这似乎不可能,或者.....我可以吗?为“UserID = @UserID”设置创建一个过滤器,并在报表本身的嵌入式VB代码中根据需要以某种方式启用/禁用它?
任何接受者?疯狂的开箱即用的想法?让我知道!
答案 0 :(得分:1)
你能尝试制作一个适合每个人的查询吗?这只是基于您在问题中包含的表格/列的猜测:
--always returns the data for the one given @UserID
SELECT
(fields)
FROM dbo.DataView
WHERE UserID = @UserID
UNION
--only returns data for the subordinates of @UserID, nothing if there are none
SELECT
(d2.fields)
FROM dbo.DataView d1
INNER JOIN dbo.DataView d2 ON d1.OrgUnitID = d2.OrgUnitID
INNER JOIN dbo.OrgHierarchy h ON d1.OrgUnitID = h.OrgUnitID
WHERE d1.UserID = @UserID and d1.UserLevel=1
答案 1 :(得分:0)
您可以尝试定义一个表值函数,该函数根据用户(db_user或report_user)保留所有逻辑
CREATE FUNCTION [dbo].[get_employee_data](@UserId nvarchar(200))
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM yourdata
where @UserId = yourdata.user_id and ....
)