【问题标题】:Aggregation - SSAS Dynamic Security over parent-child Hierarchy聚合 - 父子层次结构上的 SSAS 动态安全性
【发布时间】:2015-08-06 07:57:14
【问题描述】:

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

我创建了 Role 来相应地过滤数据,user1 只能看到 London 100 并且从这里聚合到 UK 也 100。 我还有一个 FactlessDimension 将 DimUsers 和 DimBranch 关联到多对多关系

请求是 user1,只能看到 London 100(就像以前一样),而不是 UK-100,他需要看到整个 UK (150)。可以在 SSAS 中实现吗?

【问题讨论】:

    标签: security ssas parent-child mdx olap


    【解决方案1】:

    是的,很抱歉没有注意到您的 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。

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

    【讨论】:

      【解决方案2】:

      您在设置维度安全性时是否选中了“启用可视化汇总”选项?

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

      听起来您好像以某种方式启用了此选项,这使得 UK 总数为 100。默认设置为禁用它,这将给出您想要的 London=100, UK=150 的结果。

      【讨论】:

      • 我使用以下 MDX 脚本 NonEmpty( [Dim Branch Hierarchies].[Branch Hierarchy].members, ([Measures].[Granted], StrToMember("[Dim Users].[Account Name].&["+UserName()+"]")) ) 限制了维度数据中多维数据集中的层次结构维度,并且所有属性的启用可视化汇总都已关闭
      • 我刚刚意识到您的分支维度是父子维度,我认为这会有所不同。我试图重现您的多维数据集结构,但是当我尝试使用 MDX 脚本保护维度数据时,我收到了这个令人讨厌的错误link。 (虽然我使用的是 SSAS 2014)。找不到有效的解决方案...
      猜你喜欢
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      相关资源
      最近更新 更多