BI數據分析是目前企業的熱門應用,而對企業來說,進行權限控制是必須而且非常重要的,尤其是作為決策用的企業報表。在BI解決方案中,權限控制又分為2種:一種是報表級權限控制,這類型權限控制沒有什么好講的,報表系統都本身就支持了。另一種比較復雜的就是數據級權限控制,所謂的數據級權限控制,就是用戶只能看自己權限范圍內的數據以及這些數據的統計結果。比如一個大型公司的華南區銷售主管就不能看到華北區的銷售數據和統計結果;雖然華南區主管和華北區主管都是瀏覽同一張銷售報表,但是該報表上出來的數據結果卻不一樣。
在這個系列里,我將講述下基於微軟的SSAS來實現通用的數據級權限控制解決方案。而SSRS不會在本文中涉及,因為SSRS是進行報表級權限控制的,與數據級權限的控制並沒有關系。其實有數據級權限控制支持的報表,其報表級權限控制甚至都可以不需要,因為沒有權限的用戶看到的只是一片數據上的空白;當然了,從實際角度出發,還是需要做好報表級權限控制的。
基於SQL Server的BI解決方案中,數據級權限的控制會涉及如下內容:
-
在SSAS的Cube中設置需要對哪些維度進行數據級權限控制
-
提供給用戶一個界面友好的控制台,讓用戶能夠非常方便的做數據級權限控制的配置。
為了更好的講述數據級權限控制的效果,我們以一個實例來說明。在我們的Cube中有一個維度是"區域-城市-辦公室",我們主要是控制該維度的數據級權限。區域分為:華南區、華北區、華東區、西南區、東北區;在效果上主要看對區域進行數據權限控制下的報表結果。
明白了我們的任務,首先開始的是如何在SSAS的Cube中作設置,讓其支持我們的數據級權限控制。這個設置分為2部分:
- 通過SSAS的自定義DLL來讀取用戶的權限設置,如果是我們的示例,就是讀取用戶是哪個區域的。
- 創建一個新的角色,設置該角色的維度數據的自定義允許的結果集。
第一步是開發一個.NET 類庫,並且把這個類庫部署到SSAS中,准備提供給第二步的設置中使用。其實這個類庫的代碼比較簡單,一般都不會超過50行。我們來看看代碼和簡單的說明:

public class DataSecurity { // 返回用戶有權限查看到的數據集字符串, 類似return "{[Location].[City].&[Seattle]}"; // domain_account:瀏覽報表的用戶域帳號 // dimension:要查找的維度,實際為維度的Attribute public static string GetDimensionSet(string domain_account, string dimension, string unique_name) { String connection_string = string.Empty; // BI.DataSecurity.Settings.txt 中保存了一個數據庫連接字符串,該數據庫記錄了用戶的具體權限配置。 using (StreamReader sr = new StreamReader("C:\\BI.DataSecurity.Settings.txt")) { connection_string = sr.ReadLine(); } SqlConnection connection = new SqlConnection(connection_string); connection.Open(); SqlCommand command = new SqlCommand("GetDimensionSet", connection); command.CommandType = System.Data.CommandType.StoredProcedure; SqlParameter p1 = new SqlParameter("@domain_account", domain_account); SqlParameter p2 = new SqlParameter("@dimension", dimension); command.Parameters.Add(p1); command.Parameters.Add(p2); SqlDataReader reader = command.ExecuteReader(); string result_set = string.Empty; int count = 0; while (reader.Read()) { count++; if (result_set != string.Empty) result_set += ","; result_set += (string)reader["DimensionSet"]; } command.Dispose(); connection.Close(); connection.Dispose(); if (count == 0) { return "{" + unique_name + "}"; } return "{" + result_set + "}"; } public DataSecurity() { } }
我們把這個生成的DLL命名為:BIDataSecurity.dll
接下來,就需要將這個DLL放到SSAS中以供后面的維度數據中的設置調用。
打開SSAS,點擊如下圖所示的"New Assembly...",然后在打開的窗口中,把上面的這個BIDataSecurity.dll傳到SSAS中。
完成以后,我們就完成了第一步,設置好了Cube的自定義DLL,第二步中將調用這個接口來獲取用戶的授權數據。