【问题标题】:SSAS XMLA DISCOVER: how to get list of roles in SSAS databaseSSAS XMLA DISCOVER:如何获取 SSAS 数据库中的角色列表
【发布时间】: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 网站上找不到明确的解释(文档对我来说非常古怪),希望能提供任何见解。

【问题讨论】:

    标签: sql ssas roles xmla discover


    【解决方案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。现在将更新我的问题。
        猜你喜欢
        • 2016-12-19
        • 1970-01-01
        • 2016-12-16
        • 2015-09-16
        • 2012-03-04
        • 2018-03-17
        • 2014-02-14
        • 1970-01-01
        • 2021-04-13
        相关资源
        最近更新 更多