《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。

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第1张图片

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第2张图片

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

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第3张图片

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第4张图片

下来检验我们上面的设置是否生效。我们使用UserName函数(http://msdn.microsoft.com/zh-cn/library/ms146016.aspx

在cmd中输入:

Set ComputerName

rem ‘获取机器名为AP4

RunAs /user:computername\MdxUser "ssms"

此时提示输入mdxuser账号的密码:

输入成功后,即可以MdxUser登录Analysis Service

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第5张图片

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第6张图片

例11-1

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

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第7张图片

修正以仅返回当前登录的用户名

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

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第8张图片

顺便我们介绍一个技巧,我们在查询时不知道列或者仅想作测试时,可以用empty Sets来代替,其作用类似于SQL查询中的“*”。

例11-3

SELECT
{} ON COLUMNS,
{[Product].[Product].[Product].Members} ON ROWS
FROM [Step-by-Step]

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第9张图片

2、限制标准属性层次结构(Attribute-Hierarchy Restrictions)

第一步设计允许集,在此之前我们先看一个基本示例:

例11-4

SELECT
{} ON COLUMNS,
{[User].[User].[User].Members} ON ROWS
FROM [Step-by-Step]
;

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第10张图片

如果不希望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]
;

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第11张图片

注意上例中使用了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个成员。

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第12张图片

我们作个限制:

例11-6

SELECT
{} ON COLUMNS,
Exists(
{[Product].[Product].[Product].Members},
{[User].[User].[User].[MdxUser]},
'User Product Relationship'
) ON ROWS
FROM [Step-by-Step]
;

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第13张图片

第二步实施允许集

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第14张图片

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第15张图片

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第16张图片

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

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第17张图片

有人会注意到这个结果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]
;

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第18张图片

例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

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第19张图片

我们修改查询如下:

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

第二步实施允许集

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第20张图片

第三步检验允许集:

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第21张图片

这个结果的意义是:当你用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]
;

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第22张图片

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

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第23张图片

第二步:实施设计

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

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记十二:动态安全_第24张图片

第三步:验证限制

再次执行例11-10

重要:完成本例后请务必删除MdxUser和MdxUserGroup用户组。

小结:

本文介绍动态安全的相关内容,主要包括限制标准属性层次结构,限制父子层次结构、实施Cell级别的限制。下文将继续学习创建报表,也是本书的最后一部分内容。

参考资源:

1、MDX官方教程(http://msdn.microsoft.com/zh-cn/library/ms145506.aspx


邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助!
[email protected]



你可能感兴趣的:(sql,server,2008)