Tsql 如何使用用户!用于限制报表服务器上的数据的用户ID

Tsql 如何使用用户!用于限制报表服务器上的数据的用户ID,tsql,ssrs-2008,reporting-services,Tsql,Ssrs 2008,Reporting Services,我有一个“用户”表,它将每个用户映射到允许他们查看的数据 未来的几份报告将使用此用户表,我想继续使用最佳方法,利用全局变量User!用户ID 我设置的探索报告使用了一个带有参数@myUser的存储过程——在存储过程中,数据与用户表进行内部联接,在WHERE子句中,我使用@myUser限制数据,如下所示: CREATE PROCEDURE [dbo].[pr_SSRS_Dly_Data] @myUser VARCHAR(50) AS SELECT

我有一个“用户”表,它将每个用户映射到允许他们查看的数据

未来的几份报告将使用此用户表,我想继续使用最佳方法,利用全局变量User!用户ID

我设置的探索报告使用了一个带有参数@myUser的存储过程——在存储过程中,数据与用户表进行内部联接,在WHERE子句中,我使用@myUser限制数据,如下所示:

CREATE PROCEDURE [dbo].[pr_SSRS_Dly_Data]
            @myUser VARCHAR(50)
AS

SELECT
            x.[Date]
            , x.Product                                                         
            , x.Amount
FROM
            WHReports.dbo.tb_Dly_Data x
            INNER JOIN WHReports.dbo.tb_Users  y                              
                            ON
                            x.CustomerKey = y.CustomerKey
WHERE       1 = CASE WHEN (@myUser = y.LoginName) THEN 1 ELSE 0 END 
在报告中,我使用此存储过程作为数据集,然后创建@myUser参数-在@myUser参数的默认值部分,我使用表达式User!用户ID。我还隐藏了这个参数


这是最好的方法吗?

您的方法是正确的,我只有两个小改动:

CREATE PROCEDURE [dbo].[pr_SSRS_Dly_Data]
            @myUser VARCHAR(50)
AS

SELECT
            x.[Date]
            , x.Product                                                         
            , x.Amount
FROM
            WHReports.dbo.tb_Dly_Data x
            INNER JOIN WHReports.dbo.tb_Users  y                              
            ON y.CustomerKey = x.CustomerKey
WHERE       @myUser = y.LoginName

您的方法是正确的,我只有两个小改动:

CREATE PROCEDURE [dbo].[pr_SSRS_Dly_Data]
            @myUser VARCHAR(50)
AS

SELECT
            x.[Date]
            , x.Product                                                         
            , x.Amount
FROM
            WHReports.dbo.tb_Dly_Data x
            INNER JOIN WHReports.dbo.tb_Users  y                              
            ON y.CustomerKey = x.CustomerKey
WHERE       @myUser = y.LoginName

看起来连接中也有错误-认为可能是笛卡尔坐标;我将修改其中一个别名,我在其他查询中使用了“WHERE 1=CASE WHEN…”结构,但在上面的查询中并不需要太多。如果我想使参数为NULL,那么使用CASE可能非常简单,即将以下内容添加到我的原始查询“WHEN NULL THEN 1”中。此外,为了安全起见,您应该在主数据查询中重新检查参数,而不仅仅是在提供参数的查询中。(用户可以使用URL访问来提供任何有效的参数,不管他们的ID是什么。)看起来连接中也有错误——认为可能是笛卡尔的;我将修改其中一个别名,我在其他查询中使用了“WHERE 1=CASE WHEN…”结构,但在上面的查询中并不需要太多。如果我想使参数为NULL,那么使用CASE可能非常简单,即将以下内容添加到我的原始查询“WHEN NULL THEN 1”中。此外,为了安全起见,您应该在主数据查询中重新检查参数,而不仅仅是在提供参数的查询中。(用户可以使用URL访问提供任何有效参数,而不管其ID如何。)