设为首页 收藏本站
查看: 637|回复: 0

[经验分享] 《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2016-11-8 07:57:51 | 显示全部楼层 |阅读模式
  
SQL Server 2008中SQL应用系列及BI学习笔记系列--目录索引
  导读:本文主要介绍Analysis Service的安全问题,特别是账号的权限分配,包括:
  ■1、创建一个本地测试账号和基本数据库角色
  ■2、限制标准属性层次结构(Attribute-Hierarchy Restrictions)
  ■3、限制父子层次结构(Restricting Parent-Child Hierarchies)
  ■4、实施Cell级别的限制(Implementing Cell-Level Restrictions)
  本文所用数据库和所有源码,请到微软官网下载

  
  1、创建一个本地测试账号和基本数据库角色
  创建本地账号的步骤如下:
  假定账号为MdxUser,属于用户组MdxUserGroup。


  创建数据库的角色如下:Role



  
  下来检验我们上面的设置是否生效。我们使用UserName函数(http://msdn.microsoft.com/zh-cn/library/ms146016.aspx)
  在cmd中输入:
  Set ComputerName
  rem ‘获取机器名为AP4
  RunAs /user:computername\MdxUser "ssms"
  此时提示输入mdxuser账号的密码:
  输入成功后,即可以MdxUser登录Analysis Service


  例11-1
  WITH
MEMBER [Measures].[Current User] AS
UserName()
SELECT
{[Measures].[Current User]} ON COLUMNS
FROM [Step-by-Step]
;
  

  
  修正以仅返回当前登录的用户名
  例11-2
  WITH
MEMBER [Measures].[Current User] AS
VBAMDX!Right(
UserName(),
VBAMDX!Len(UserName()) -
VBAMDX!Instr(UserName(),"\")
)
SELECT
{[Measures].[Current User]} ON COLUMNS
FROM [Step-by-Step]
;

  顺便我们介绍一个技巧,我们在查询时不知道列或者仅想作测试时,可以用empty Sets来代替,其作用类似于SQL查询中的“*”。
  例11-3
  SELECT
{} ON COLUMNS,
{[Product].[Product].[Product].Members} ON ROWS
FROM [Step-by-Step]
  http://onexin.iyunv.com/source/plugin/onexin_bigdata/https://public.bay.livefilestore.com/y1pt6Se3kM58er--o2QcFyjrtfF3tBKK8eQOmt6mh4_kGSPuf99mBxlEsQ5SbtnitJvB0zyVMkv5K6PUs2vD8TDUw/2011-12-2%2014-58-47.png?psid=1
  
  2、限制标准属性层次结构(Attribute-Hierarchy Restrictions)
  第一步设计允许集,在此之前我们先看一个基本示例:
  
  例11-4
  SELECT
{} ON COLUMNS,
{[User].[User].[User].Members} ON ROWS
FROM [Step-by-Step]
;

  如果不希望MdxOtherUser出现在这个查询结果中,那么如下:
  例11-5
  SELECT
{} ON COLUMNS,
StrToSet(
"{([User].[User].[User].[" +
VBAMDX!Right(
UserName(),
VBAMDX!Len(UserName()) -
VBAMDX!Instr(UserName(),"\")
) + "])}"
) ON ROWS
FROM [Step-by-Step]
;

  注意上例中使用了StrToSet(http://msdn.microsoft.com/zh-cn/library/ms144782.aspx),类似的还有
  StrToValue(http://msdn.microsoft.com/zh-cn/library/ms144951.aspx)
  StrtoTuples(http://msdn.microsoft.com/zh-cn/library/ms146079.aspx)
  
  在例11-3中执行结果切换到Message视图产,可以看到有397个成员。

  我们作个限制:
  例11-6
  SELECT
{} ON COLUMNS,
Exists(
{[Product].[Product].[Product].Members},
{[User].[User].[User].[MdxUser]},
'User Product Relationship'
) ON ROWS
FROM [Step-by-Step]
;

  第二步实施允许集



  
  设置完成,我们第三步检验设置效果:

  
  有人会注意到这个结果109与刚才的108不一致,其实,限制集并不关心是否与MdxUser有关联,所以是109。
  此时,再重新执行例11-4,结果只有MdxUser一项。
  3、限制父子层次结构(Restricting Parent-Child Hierarchies)
  在一个维度中,如果引用自身,比如最典型的父子层次关系是员工和账户。一个员工出于业务需要可能有多个账户。第一步设计允许集
  我们看一个查询实例:
  例11-7
  SELECT
{} ON COLUMNS,
{[Employee].[Employees].Members} ON ROWS
FROM [Step-by-Step]
;

  例11-8
  WITH
MEMBER [Measures].[User] AS
[Employee].[Employees].CurrentMember.Properties("User")
SELECT
{([Measures].[User])} ON COLUMNS,
{[Employee].[Employees].Members} ON ROWS
FROM [Step-by-Step]
;
  
  注意到Stephen Y.Jiang对应的windows用户为MdxUser

  我们修改查询如下:
  例11-9
  WITH
MEMBER [Measures].[User] AS
[Employee].[Employees].CurrentMember.Properties("User")
SELECT
{([Measures].[User])} ON COLUMNS,
Filter(
{[Employee].[Employees].Members},
[Employee].[Employees].CurrentMember.Properties("User")=
VBAMDX!Right(
UserName(),
VBAMDX!Len(UserName()) -
VBAMDX!Instr(UserName(),"\")
)
) ON ROWS
FROM [Step-by-Step]
;
  第二步实施允许集

  第三步检验允许集:

  这个结果的意义是:当你用MdxUser账户登录后,你可以访问这14个层次关系的成员,包括直接的和间接的。
  
  4、实施Cell级别的限制(Implementing Cell-Level Restrictions)
  重要:本段内容以上段内容为基础,因此,对应的MdxUser限制也基于上例。如果没有完成上例,请先完成第3部分的操作。
  第一步:设计逻辑表达式
  例11-10
  SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
{[Employee].[Employees].Members} ON ROWS
FROM [Step-by-Step]
;

  例11-11
  WITH
MEMBER [Measures].[Is Accessible] AS
Count(
Intersect(
Ascendants([Employee].[Employees].CurrentMember),
Filter(
{[Employee].[Employees].Members},
[Employee].[Employees].CurrentMember.Properties("User")=
VBAMDX!Right(
UserName(),
VBAMDX!Len(UserName()) -
VBAMDX!Instr(UserName(),"\")
)
)
)
) > 0
SELECT
{
([Measures].[Reseller Sales Amount]),
([Measures].[Is Accessible])
} ON COLUMNS,
{[Employee].[Employees].Members} ON ROWS
FROM [Step-by-Step]
;
  http://onexin.iyunv.com/source/plugin/onexin_bigdata/https://public.bay.livefilestore.com/y1pbg884pvppZWFcHJWSbpNpdUlIM_sMYAdJYRX6Puvt3sT_9C1wQGJY_7miSmMaawqIQVarRhdoAH2DraredxGCw/2011-12-2%2016-52-10.png?psid=1
  第二步:实施设计
  Count(
Intersect(
Ascendants([Employee].[Employees].CurrentMember),
Filter(
{[Employee].[Employees].Members},
[Employee].[Employees].CurrentMember.Properties("User")=
VBAMDX!Right(
UserName(),
VBAMDX!Len(UserName()) -
VBAMDX!Instr(UserName(),"\")
)
)
)
) > 0

  第三步:验证限制
  再次执行例11-10

  
  重要:完成本例后请务必删除MdxUser和MdxUserGroup用户组。
  
  小结:
  本文介绍动态安全的相关内容,主要包括限制标准属性层次结构,限制父子层次结构、实施Cell级别的限制。下文将继续学习创建报表,也是本书的最后一部分内容。
  参考资源:
  1、MDX官方教程(http://msdn.microsoft.com/zh-cn/library/ms145506.aspx)
  

  
邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助!
3w@live.cn


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-297102-1-1.html 上篇帖子: 装完sql server 后修改计算机名后不能进行发布的订阅的解决办法 下篇帖子: sql server安装时的本地系统账户和域用户账户区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表