代码之家  ›  专栏  ›  技术社区  ›  hollystyles

使用MDX表达式的SQL Server Analysis Services 2008动态维度安全性

  •  1
  • hollystyles  · 技术社区  · 17 年前

    我的仓库中的一些维度表:

    DML
    Site
        Id      bigint
        Name    nvarchar(256)
        Primary key (Id)
    
    DATA
    SiteId    Name
    2         Site 2
    3         Site A
    
    DML
    UserSite
        Username    nvarchar(256)
        SiteId      bigint
        Primary key (Username, SiteId)
        Foreign key (SiteId) referrences Site(Id)
    
    DATA
    Username    SiteId
    EMSUser1    2
    EMSUser1    3
    EMSUser2    3
    

    我的SSAS项目: 在使用维度向导创建的BIDS项目中,我在一维中使用了这两个维度表。 用户名与SSAS服务器上的两个本地Windows用户帐户相关,它们是本地Windows的成员 组报表浏览器。我在BIDS中为该组创建了一个角色,并将MDX表达式添加到维度数据选项卡中。 对于用户名属性的allowedset框中的此维度:

    STRTOMEMBER("[UserSiteSite].[Username].["+Trim(Mid( UserName, InStr(1, UserName, "\")+ 1,128))+"]")
    

    此维度用于所有处理和部署的多维数据集中。然后我有一个基于那个立方体的SSRS报告。

    我的意图是: 我要做的是将当前正在浏览SSR的登录用户带走,并删除返回字符串的“<domain>\”部分 有效地将结果过滤到用户名有记录的站点。

    因此,对于emsuser1,我应该看到两个站点的记录,但它似乎只允许第一个站点(“ID为2的站点2”)。 即使事实数据表中存在该站点的记录,也没有“站点A”的迹象。

    我一直在搜索2008年发布的AnalysisServices2008,一步一步的阅读,以及所有的博客等等。 我只是不能摸索内部工作来达到我的目标。

    我做错什么了?

    1 回复  |  直到 17 年前
        1
  •  0
  •   hollystyles    17 年前

    好吧,已经有一段时间了。我现在还没有完整的答案,但我确实得到了一些帮助,在其他方面我找到了解决方案。可以找到详细信息 here .

    有很多方法可以解决这种情况。我觉得可能还有更好的,但我有一些东西至少能起作用。基本上,用一个静态类和函数创建一个单独的类库,使它自己连接到数据库,并选择允许的集合。如果引用Microsoft.AnalysisServices 以及microsoft.analysissservices.adomdserver命名空间,可以返回“set”对象。然后可以在“角色对象”“维度数据高级”选项卡中调用此函数:

    MyAssembly.MyMethod(UserName)
    
    推荐文章