SSAS XMLA DISCOVER:如何获取 SSAS 数据库中的角色列表

Posted

技术标签:

【中文标题】SSAS XMLA DISCOVER:如何获取 SSAS 数据库中的角色列表【英文标题】:SSAS XMLA DISCOVER: how to get list of roles in SSAS database 【发布时间】:2020-09-29 18:51:15 【问题描述】:

我正在尝试使用 XMLA 获取 SSAS 数据库中存在的角色列表。我只需要角色,不需要其他信息。

我知道有一个<RequestType>DISCOVER_XML_METADATA</RequestType>

<Discover xmlns="urn:schemas-microsoft-com:xml-analysis">  
   <RequestType>DISCOVER_XML_METADATA</RequestType>  
   <Restrictions>
       <RestrictionList xmlns="urn:schemas-microsoft-com:xml-analysis">
           <DatabaseID>SSAS_DB_ID</DatabaseID>
       </RestrictionList>
   </Restrictions>  
   <Properties>  
      <PropertyList>
      </PropertyList>  
   </Properties>  
</Discover>

查询返回一个约 9Mb 的 XML,其中包含关于数据库的完整信息,包括我不需要的信息。

是的,它确实包含带有角色的片段:

...
     <Roles>
        <Role>
          <Name>ROLE_NAME_AND_ID1</Name>
          <ID>ROLE_NAME_AND_ID1</ID>
          <CreatedTimestamp>2020-05-13T11:20:27.343333</CreatedTimestamp>
          <LastSchemaUpdate>2020-06-03T06:16:53.816667</LastSchemaUpdate>
          <Description />
          <Members>
            <Member>
              <Sid>SID1</Sid>
              <Name>DOMAIN\LOGIN1</Name>
            </Member>
            <Member>
              <Sid>SID2</Sid>
              <Name>DOMAIN\LOGIN2</Name>
            </Member>
          </Members>
        </Role>
      </Roles>
...

但我想只有角色列表,没有其他任何东西。

在网络或 MS 网站上找不到明确的解释(文档对我来说非常古怪),希望能提供任何见解。

【问题讨论】:

【参考方案1】:

更新: 我需要在 SQL 过程中使用角色和成员列表。我设法在一个过程中使用了DISCOVER_XML_METADATA 的结果。下面是工作代码。

仍然,它必须从 SSAS 加载完整的 XML_METADATA(而不仅仅是角色,正如我在主要问题中的意图),但它可以工作。

declare @SSASDBName nvarchar(255) = 'SSAS_DB_NAME'

-- when executed from SQL, XMLA Discover has to be wrapped in <Batch>
declare @XMLA nvarchar(MAX)
select @XMLA = '<Batch xmlns="http://schemas.microsoft.com/analysisservices/2003/engine" Transaction="true">
<Discover xmlns="urn:schemas-microsoft-com:xml-analysis">  
   <RequestType>DISCOVER_XML_METADATA</RequestType>  
   <Restrictions>
       <RestrictionList xmlns="urn:schemas-microsoft-com:xml-analysis">
           <DatabaseID>'+@SSASDBName+'</DatabaseID>
       </RestrictionList>
   </Restrictions>
   <Properties/>
</Discover></Batch>'

-- get the XML response from SSAS
declare @t table (x XML)
insert @t
EXEC(@XMLA) AT LINKED_SSAS_SERVER -- linked SSAS server

declare @XMLAResult xml
select @XMLAResult = x from @t

-- expand XML response
;with XMLNAMESPACES (default 'urn:schemas-microsoft-com:xml-analysis:rowset')
select
    SSAS_DB                     = X_DB.x.query('./ID').value('.','nvarchar(255)'),
    RoleID                      = X_Roles.x.query('./ID').value('.','nvarchar(255)'),
    RoleMember                  = X_Members.x.query('.').value('.','nvarchar(255)')
from @XMLAResult.nodes('//Database') X_DB(x)
cross apply @XMLAResult.nodes('//Roles/Role') X_Roles(x)
cross apply X_Roles.x.nodes('./Members/Member/Name') X_Members(x)

screenshot

【讨论】:

【参考方案2】:

另一种选择是使用 DMV $SYSTEM.TMSCHEMA_ROLES$SYSTEM.TMSCHEMA_ROLE_MEMBERSHIPS。您可以使用Invoke-ASCmd查询

例如

$serverUri="server.asazure.windows.net/model"

Invoke-ASCmd -Server $serverUri -Query "select * from `$SYSTEM.TMSCHEMA_ROLES"

【讨论】:

【参考方案3】:

一种选择是将这个免费的开源ASSP 程序集添加到您的服务器或数据库中,然后运行以下命令(参见此示例和其他与角色相关的here):

CALL ASSP.DiscoverXmlMetadata("\Database\Roles\Role");

另一种选择是使用这个免费的开源 Visual Studio 扩展BI Developer Extensions,它可以生成一个roles report,您可以将其导出为 PDF。此选项的优点是它查询 Active Directory 以递归扩展组以查看成员。

【讨论】:

谢谢,我已经看到多次提到ASSP。问题是我无法在 SSAS 服务器上安装其他程序集。另外,我没有提到我需要从 SQL 过程调用 XMLA。现在将更新我的问题。

以上是关于SSAS XMLA DISCOVER:如何获取 SSAS 数据库中的角色列表的主要内容,如果未能解决你的问题,请参考以下文章

通过 XMLA 处理 SSAS 多维数据集

使用 Python 连接到 SSAS OLAP Cube

如何在MSAS2008中查询(xmla)OLAP目录的大小?

在 XMLA 中传递参数

BI之SSAS完整实战教程7 -- 设计维度细化维度中 :浏览维度,细化维度

通过忽略维度键错误的 XMLA 脚本处理维度和多维数据集