SSAS Tabular表格模型實現動態許可權管理
最近忽然對SSAS產生了濃厚興趣,我看部落格園上也米有寫關於SSAS 2016下表格模型實現動態許可權管理的文章,最近鼓搗了一下微軟的樣例,鼓搗好了,把過程中遇到的一些問題寫出來,拋磚引玉,也算給自己一個交代。
首先放出微軟官網的教程:
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表示式。
所以我們依然需要在設計模型的時候新增角色,在角色中新增真正的使用者,但是這個角色的含義是所有許可權需要動態控制的使用者的列表,理論上會新增很多人,但是隻要新增好一次,在因為業務原因許可權發生變動的時候,就無需重新修改和部署這個Tabular表格模型中的角色了。
還有一個需要注意的點是,我們在SSDT中開發Tabular表格模型專案的時候,需要本身執行SSDT的賬號在SSAS例項下擁有admin許可權,但是admin許可權過大了,不會受到模型中角色的許可權限制,這個無論是靜態寫死的角色還是動態賦權的角色都是如此,也符合微軟一貫的許可權管理模型模式,即管理員不受任何許可權控制。那麼如何在SSDT中使用在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資料,但是又遇到許可權不夠的問題無法開啟專案的問題,怎麼辦?
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值產生關聯。
別問有沒有圖了,沒圖,微軟的樣例圖很多。
<