聚合 - 父子层次结构上的 SSAS 动态安全性

Aggregation - SSAS Dynamic Security over parent-child Hierarchy

我想构建以下 SSAS 安全情况:

我创建了角色来相应地过滤数据,user1 只能看到伦敦 100,从这里到英国的聚合也是 100。 我还有一个将 DimUsers 和 DimBranch 关联成多对多关系的 FactlessDimension

请求是用户 1 只能看到伦敦 100(就像以前一样),而不是 UK-100 他需要看到所有英国 (150)。是否可以在 SSAS 中实施?

设置维度安全时,您检查过"Enable Visual Totals"选项吗?

http://bidn.com/blogs/jamserra/ssas/1881/show-correct-totals-when-using-ssas-role-security

听起来好像你以某种方式启用了这个选项,这使得英国总计 100。默认情况下它被禁用,这将给出你想要的结果 London=100,UK=150。

是的,很抱歉没有注意到您的 Branch 维度是 parent-child - 即使那是在问题标题中!

我已经根据您的设置设置了一个测试立方体(据我所知)。我忽略了设置自定义 MDX 角色安全性时出现的愚蠢错误 "Dimension Users could not be found";并忽略在 SSDT(又名 Visual Studio)多维数据集浏览器中,此自定义安全性 不起作用 的事实。让我们把它归结为 SSDT UI 作为 POS - 因为在 SSMS MDX 查询中,我得到了我所期望的。

这是我的分支 table:

BranchID    ParentID    BranchName
1           NULL        Scotland
2           NULL        England
3           1           Glasgow
4           1           Edinburgh
5           2           Bristol
6           2           London

Branch 维度上有两种层次结构:一种称为 BranchID(简称为 BranchID 属性),另一种称为 ParentChild,即使用 ParentID 的 parent-child 层次结构。

我通过在“允许的成员集”框中使用此表达式来限制 "restricted" 用户对 Branch.ParentChild 层次结构的访问:

NONEMPTY(Branches.[ParentChild].members,  
(Measures.UserBranchAccess,StrToMember("[Users].[" + UserName + "]")))

所以现在我通过填充 table 来向 "restricted access" 用户授予对所有分支的访问权限,我调用 UserBranchAccess。 (我将生成的 COUNT 度量称为 UserBranchAccess)。然后我通过删除相应的行来删除对布里斯托尔的访问。

运行 SSMS 中的此查询将 EffectiveUserName 设置为 "restricted user",我得到的正是您要查找的结果:

SELECT
NONEMPTY(Branches.[ParentChild].members,   
(Measures.UserBranchAccess,StrToMember("[Users].[" + UserName + "]"))) 
ON 0
FROM [Test Dimensions]

结果:

All England London  Scotland    Edinburgh   Glasgow
700 550     50      150         50          100

(此处显示了我称为 Branch Total 的默认度量 - 请注意,未显示布里斯托尔的 500,但包含在英格兰总数中)。

然后我尝试删除 "restricted" 用户对 布里斯托尔和英格兰的访问权限。我得到完全相同的结果。

让我们看看 "security" 度量 UserBranchAccess 发生了什么:

SELECT
Branches.[ParentChild].members ON 0
FROM [Test Dimensions]
WHERE
(UserBranchAccess,Users.[User ID].[RestrictedUser])

结果:

All England Bristol London  
4   1       (null)  1

(为清楚起见未显示苏格兰)。

英格兰被允许,因为至少有一个 children 被允许。

只是为了检查我没有遗漏任何处理,我做了相同的查询,但是在 Branch 维度的(非 parent-child)层次结构上:

SELECT Branches.[BranchID].Members ON 0
FROM [Test Dimensions]
WHERE
(UserBranchAccess,Users.[User ID].[EMEA\martinhe])

结果符合预期:在正常的 BranchID 层次结构中未明确允许英格兰,但在 parent-child 层次结构中允许(参见之前的结果):

All Bristol England London
4   (null)  (null)  1

(同样,为清楚起见,未显示苏格兰)。

所以最重要的是我无法重现您遇到的问题,因此(使用我的数据)伦敦会显示 50 英格兰也只会显示 50 .

但也许您可以确定您的设置与我的设置有何不同?