需求描述:
某些特殊的場景下,針對某頁看板,需要進行數據權限卡控,但是又不能對全部的數據進行RLS處理,這種情況下可以利用計算組來解決這個需求。
實際場景
-
事實表包含產品維度和銷售維度
-
兩個維度屬于同一公司下面的不同架構體系
-
要求用戶在查看不同頁面的時候,根據
不同的體系進行控權
案例數據
數據比較簡單,分別是銷售維度、產品維度、事實表以及權限表。
模型關系如下圖:
構建基礎度量值:
Amt?=?
SUM?(?'Fact'[銷售金額]?)
Qty?=?
SUM?(?'Fact'[銷售數量]?)
將其拖拽出來,如下:
為了方便給大家展示,白茶這里拖拽了兩個一模一樣的圖表。
注意,不單是頁面權限,針對不同可視化的數據權限控制辦法也是一樣的。
解決思路
利用DAX函數,復制銷售維度和產品維度
不與其他表建立模型關系
配置RLS權限
VAR?AccessCount?=CALCULATETABLE?(?VALUES?(?'Access'[產品權限]?),?'Access'[用戶姓名]?=?USERNAME?()?)
RETURN'RLS_Product'[產品]?IN?AccessCount
VAR?AccessCount?=CALCULATETABLE?(?VALUES?(?'Access'[銷售權限]?),?'Access'[用戶姓名]?=?USERNAME?()?)
RETURN'RLS_Dep'[銷售代表]?IN?AccessCount
添加計算組
打開Tabular,選擇創建計算組
CALCULATE?(SELECTEDMEASURE?(),KEEPFILTERS?(?TREATAS?(?VALUES?(?'RLS_Product'[產品]?),?'Dim_Product'[產品]?)?)
)
CALCULATE?(SELECTEDMEASURE?(),KEEPFILTERS?(?TREATAS?(?VALUES?(?'RLS_Dep'[銷售代表]?),?'Dim_Dep'[銷售代表]?)?)
)
到這里,我們的所有設置基本完成
效果如下
回到PowerBI的兩個頁面,分別添加計算組到頁面篩選
我們代入一下T1這個用戶來看看兩個頁面的數據
產品權限
銷售權限
補充
-
如果使用RLS配置角色直接控制銷售維度和產品維度,那么
整個數據模型
都會進行過濾 -
一個RLS設置兩張表,二者是
取交集
-
兩個RLS設置兩張表,二者是
取并集
-
DAX中
沒有函數
可以獲取到用戶的RLS角色名稱 -
可視化組件的權限設置與上面一致,區別在于卡控的是單獨的
可視化篩選
,而不是頁面篩選