SSAS Tabular表格模型实现动态权限管理

最近突然对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

相关文章
相关标签/搜索