是的,很抱歉没有注意到您的 Branch 维度是父子维度 - 即使问题标题中是这样!
我已经设置了一个测试立方体来反映您的设置(据我所知)。我忽略了设置自定义 MDX 角色安全性时出现的愚蠢错误“找不到维度用户”;并忽略在 SSDT(又名 Visual Studio)多维数据集浏览器中,此自定义安全性不起作用的事实。让我们将其归结为 SSDT UI 作为 POS - 因为在 SSMS MDX 查询中,我得到了我所期望的。
这是我的 Branches 表:
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 的父子层次结构。
我通过在“允许的成员集”框中使用此表达式来限制“受限”用户对 Branch.ParentChild 层次结构的访问:
NONEMPTY(Branches.[ParentChild].members,
(Measures.UserBranchAccess,StrToMember("[Users].[" + UserName + "]")))
所以现在我通过填充我称为 UserBranchAccess 的表将所有分支的访问权限授予“受限访问”用户。 (我称之为 UserBranchAccess 的结果 COUNT 度量)。然后,我通过删除相应的行来移除对 Bristol 的访问权限。
在将 EffectiveUserName 设置为“受限用户”的 SSMS 中运行此查询,我得到了您正在寻找的结果:
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 未显示,但包含在英格兰总数中)。
然后,我尝试删除“受限”用户对布里斯托尔和英格兰的访问权限。我得到完全相同的结果。
让我们看看“安全”措施 UserBranchAccess 发生了什么:
SELECT
Branches.[ParentChild].members ON 0
FROM [Test Dimensions]
WHERE
(UserBranchAccess,Users.[User ID].[RestrictedUser])
结果:
All England Bristol London
4 1 (null) 1
(为清楚起见,未显示苏格兰)。
英格兰是被允许的,因为它的至少一个孩子是被允许的。
为了检查我没有错过任何处理,我做了同样的查询,但在分支维度的(非父子)层次结构上:
SELECT Branches.[BranchID].Members ON 0
FROM [Test Dimensions]
WHERE
(UserBranchAccess,Users.[User ID].[EMEA\martinhe])
结果如预期:英格兰在正常的 BranchID 层次结构中未被明确允许,但在父子层次结构中被允许(参见上一个结果):
All Bristol England London
4 (null) (null) 1
(同样,为了清楚起见,苏格兰没有显示)。
所以底线是我无法重现您遇到的问题,因此(使用我的数据)伦敦会显示 50 而英格兰也只会显示 50。
但也许您可以确定您的设置与我的设置有何不同?