数据库和多维数据库的权限管理的技巧

对于数据库, 提供行级别的权限管理的一个技巧就是在表的外面套一层view, 在view的逻辑里利用:

SELECT system_user
语句来获取当前用户的用户名, 再join相关的权限表得知用户可以有权限访问什么样filter下的数据, 最后view返回的数据和表的schema是一样的, 但是其实已经filter过了. 用户不能访问表, 只能访问这个封装表的view.


对于SSAS, 要注意的是访问权限记得去防火墙里配好2382, 2383两个端口的出入站许可.


SSAS在行级别上的权限有一个专门的界面可以配置, 首先找到你要为其配置权限的Role, 然后编辑这个Role:


要限定Role能访问什么的Measure或Calculate Member在Cell Data标签里配置,这里说下Read-contingent这个权限和Read的区别: Contingent就是视情况而定的意思, 比如一个Calculate Member名叫Profit, 它是两个Measure的差值:Sales和Cost,即:

[Profit]=[Measure].[Sales]-[Measure].[Cost]

如果一个Role在Profit上的权限是Read-contingent, 同时该Role拥有Sales和Cost的Read权限,那这个用户就能获得Profit的Read权限, 如果在Sales或Cost上它缺其中任意一个的权限, 那就不能读到Profit.


要限定Role能访问什么样的Dimension则在Dimension Data中去配置.

这个配置分成两种模式:基本和高级. 基本模式就是把维度树给你, 你来勾选当前Role能看到的维度节点.

高级模式则是用MDX来指明哪些节点的 访问/拒绝/默认 情况, 其实就是写一个set, 比如:

{[Queue].[Queue].&[22],[Queue].[Queue].&[28]}

这里的 "默认" 是指MDX查询语句中没有提到这个维度, 而查询的Measure又和这个维度的确相关联的情况下, 用这个维度的什么节点去计算Measure, 一般当然是 All. 我在网上还看更加精细的权限控制, 要给SSAS注入dll文件, 然后这个框里直接填MDX语句, 还是填调用dll文件函数的代码, 比如:

StrtoSet(BI.DataSecurity.GetDimensionSet(USERNAME, "Queue"))

这里的USERNAME是一个SSAS自带的内部变量, GetDimensionSet是DLL里函数名字, 这个函数另外一个参数是维度名字, 这里传了一个Queue.




posted @ 2017-04-06 19:17  爱知菜  阅读(21)  评论(0编辑  收藏  举报