导读:本文主要介绍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)