使用行级别权限实现列权限控制
PowerBI是支持RLS和OLS的,即行级别权限控制和列级别控制,但是OLS是有很多限制的,特别是在和OLS混合使用时,具体的限制可以参考官方的文档:
https://docs.microsoft.com/zh-cn/analysis-services/tabular-models/object-level-security?view=asallproducts-allversions&viewFallbackFrom=power-bi-premium-current
所以在PowerBI列级权限介绍时已提供过一种解决方案可以让我们同时使用RLS和OLS,把原始列隐藏,然后度量值里判断是否有权限,有权限就显示值,没有权限就返回空或其他。
今天,就来介绍另外一种解决方案,以供有权限的人可以通过原始列来查看数据而不是度量值,整体思路和先前的类似,还是把OLS转换为RLS。
基础度量如下
Sales Amt = SUM( 'FactInternetSales'[SalesAmount] )
Cost Amt = SUM( 'FactInternetSales'[TotalProductCost] )
现在需求如下,当角色权限只有US区域的时候,不能查看TotalProductCost列的值,当为AU的时候可以查看。
创建角色
我们先创建两个角色,au和us,权限分别为对应对区域
修改模型
进入到pq界面,为销售表添加一个索引列(如果有唯一值就不需要创建),然后再删除TotalProductCost列
复制一份销售表,重命名为FactInternetSalesCost, 只可留Index和Cost列,关闭并应用。
创建关系
这里要注意,关系是一对多,单一。
修改Cost Amt的度量值
Cost Amt = SUM( 'FactInternetSalesCost'[TotalProductCost] )
修改权限
因为这里采用的是静态权限控制,所以是直接设置为了us下cost表为false,如果是动态权限控制,只需要判断是否为空即可,比如
isblank([index])
切换us角色查看数据,会发现看不到cost的值,但也并没有报错,因为,它实际上使用的还是行级别权限控制。
总结
通过将销售表拆分为两张表,然后用RLS的方法来实际了OLS的需求,虽然这个需求又增加了模型中的表,并且还增加了存储占用,但有时候面对用户提的无理取闹的需求,我们却只能想办法去满足。就好像我遇到的最多的一个需求,允许用户将数据从PowerBI导出到Excel。所以有人戏称BI的本质就是连接Excel数据源,然后建立模型,然后导出数据到Excel。
当然了,遇到的最离谱的需求是要在PowerBI里直接修改原始数据,并将数据返回到数据库中,虽然是有这样的收费的第三方图表,通过Power Apps也可以实现,虽然BI是为业务服务的,但。。。。
最后,希望上海疫情快点过去吧,小区那么大,我想去走走。
本篇文章来源于微信公众号: PowerBI木小桼