ssasxmla发现:如何获取ssas数据库中的角色列表

42fyovps  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(447)

我正在尝试使用xmla获取ssasdb中存在的角色列表。我只需要角色,不需要其他信息。
我知道有一个 <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>
...

但是我只想要角色列表而不想要别的。
找不到一个明确的解释在网上或微软网站(那里的文件是非常奇怪的我),并将感谢任何见解。

htzpubme

htzpubme1#

更新:我需要在sql过程中使用角色和成员的列表。我成功地利用了 DISCOVER_XML_METADATA 在程序中。下面是工作代码。
尽管如此,它还是必须从ssas加载完整的xmlu元数据(而不是像我在主要问题中所想的那样,仅加载角色),但它是有效的。

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)

截图

ddhy6vgd

ddhy6vgd2#

另一种选择是使用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"
1sbrub3j

1sbrub3j3#

一种方法是将此免费开源assp程序集添加到服务器或数据库中,然后运行以下程序(请参见此示例和此处其他与角色相关的程序集):

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

另一个选择是使用这个免费的开源visualstudio扩展bideveloper扩展,它可以生成一个可以导出为pdf的角色报告。此选项的优点是它通过查询active directory递归地展开组来查看成员。

相关问题