最近突然對SSAS產生了濃厚興趣,我看博客園上也米有寫關於SSAS 2016下表格模型實現動態權限管理的文章,最近鼓搗了一下微軟的樣例,鼓搗好了,把過程當中遇到的一些問題寫出來,拋磚引玉,也算給本身一個交代。數據庫
首先放出微軟官網的教程:app
https://docs.microsoft.com/zh-cn/power-bi/desktop-tutorial-row-level-security-onprem-ssas-tabular?from=singlemessage&isappinstalled=0函數
要點主要是SSAS Tabular表格模型在SSAS 2016以後多加了2個DAX函數,分別是username()和lookupvalue(),配合使用就能夠返回須要在dim表中過濾的Key值,從而過濾返回結果的範圍,本質上仍是行篩選器的應用。測試
在微軟的樣例中,DAX表達式=DimSalesTerritory[SalesTerritoryKey]=LOOKUPVALUE(DimUserSecurity[SalesTerritoryID], DimUserSecurity[UserName], USERNAME(), DimUserSecurity[SalesTerritoryID], DimSalesTerritory[SalesTerritoryKey])的返回值只有一個,由於在配置表中這名用戶只有一個區域Key,若是用戶配置成了擁有多個區域的Key,也就是配置表中擁有多行記錄,那麼返回函數會返回多個Key值,無需修改DAX表達式。ui
因此咱們依然須要在設計模型的時候添加角色,在角色中添加真正的用戶,可是這個角色的含義是全部權限須要動態控制的用戶的列表,理論上會添加不少人,可是隻要添加好一次,在由於業務緣由權限發生變更的時候,就無需從新修改和部署這個Tabular表格模型中的角色了。設計
還有一個須要注意的點是,咱們在SSDT中開發Tabular表格模型項目的時候,須要自己運行SSDT的帳號在SSAS實例下擁有admin權限,可是admin權限過大了,不會受到模型中角色的權限限制,這個不管是靜態寫死的角色仍是動態賦權的角色都是如此,也符合微軟一向的權限管理模型模式,即管理員不受任何權限控制。那麼如何在SSDT中使用在excel中測試這個選項來測試角色權限呢?過程有些曲折可是確實可行,我已經在我本地測試成功了,步驟以下:excel
1.使用ssas下具備admin權限的用戶在SSDT中開發設計模型完畢,rebuild all success,而後關閉項目;教程
2.run as different user打開SSDT很差使,由於你run as different user確實打開了另外一個用戶上下文的SSDT,可是到使用execl中測試這個功能的時候,就是你當前登錄桌面使用的用戶了,不是SSDT中你run as different那個了;開發
3.因此須要用真正須要測試權限的用戶登錄項目所在機器的RDP,打開SSDT,process數據,可是又遇到權限不夠的問題沒法打開項目的問題,怎麼辦?rem
4.臨時將須要測試權限的用戶在SSAS中賦予admin權限,使這名用戶能夠成功在SSDT中打開項目,process數據,標誌是能夠在SSDT中看到數據行;
5.填充完數據以後,把這個普通用戶的SSAS admin權限拿掉,而後再點擊按鈕,使用在excel中測試,用戶名就選當前用戶;
6.若是以前的模型設計,權限設置,行篩選器都配置的沒有問題,那麼在新打開的excel中就能看到過濾後的效果了。
因此動態權限的管理,不管是在多維數據集模型下仍是在表格模型下,都是從dim 表中各個在事實表中關聯的Key值上下手,首先想辦法知道當前點開這個報表的人是誰,而後查找權限表,看這我的擁有哪些key值,而後只給他看他擁有key值的那些數據。
在權限表的設計上其實也有門道,由於這個權限表其實是存在於SQL Server或者其餘關係數據庫裏面的一張普通表,如何確保這個表的內容不被篡改?在擁有多個須要控制權限的維度時產生的大量笛卡兒積數據如何存放和維護?我本人的作法是,每個模型中的dim表,專門設置一個權限表,好比模型中,fact表中有10個dim表的key值,那麼至多我就會設計10個權限表,每一個表單獨維護,而後建立權限視圖,把這10個表按照username()的返回值join起來,不丟任何一個列和行,而後在SSAS模型中添加這個權限視圖,再跟fact表根據key值產生關聯。
別問有沒有圖了,沒圖,微軟的樣例圖不少。
BR