zoukankan      html  css  js  c++  java
  • 《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全

    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]

    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]
    ;

    邀月工作室

    第二步:实施设计

    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

  • 相关阅读:
    记 · 佛系青年 · 嗯我百度了下
    【CSS】452- 浏览器解析 CSS 样式的过程
    记 · 平安夜 · 平安平安平安
    【Vuejs】451- Vue CLI 首屏优化技巧
    【网站发布】前端自习课
    【CSS】450- 温故而知我不懂的CSS
    【CSS】449- CSS第四级选择器
    RabbitDemo —— Topic
    RabbitDemo —— Fanout
    RabbitDemo —— Direct
  • 原文地址:https://www.cnblogs.com/downmoon/p/2272381.html
Copyright © 2011-2022 走看看