《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

posted @ 2011-12-02 17:04  邀月  阅读(1142)  评论(5编辑  收藏  举报