|

使用行级别权限实现列权限控制


15

足不出户,足不出沪


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木小桼

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注