2012-03-24 32 views
1

我有一個「用戶」表,它將每個用戶映射到允許他們查看的數據。如何使用User!UserID限制報表服務器上的數據

幾個未來的報告將使用此用戶表,我想繼續採用最佳方法來利用全局變量User!UserID。

我設置的探索性報告使用帶有參數@myUser的存儲過程 - 在Sproc中,數據是INNER JOINED用戶表,在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 

在報告中,我使用此Sproc作爲數據集,然後創建@myUser參數 - 在@myUser參數的默認值部分中,我使用表達式User!UserID。我也使這個參數隱藏。

這是最好的方法嗎?

回答

1

你的做法是正確的,我只是有2個小的變化:

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 
+1

看起來像有一個在錯誤的JOIN藏漢 - 想這可能是笛卡爾;我將修改其中一個別名 – whytheq 2012-03-26 11:00:54

+0

我在其他查詢中使用了「WHERE 1 = CASE WHEN ....」這個結構,但在上面沒有太多需要。如果我想使參數爲NULLable,可能使用CASE可能相當優雅,即將以下內容添加到我的原始查詢中:「WHEN NULL THEN 1」 – whytheq 2012-03-26 11:06:52

+0

另外,爲了安全起見,您應該重新檢查主數據查詢中的參數,而不僅僅是提供參數的查詢。 (用戶可以使用URL訪問來提供任何有效的參數,而不考慮其ID。) – 2012-03-26 13:48:59

相關問題