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 数据库中的角色列表的主要内容,如果未能解决你的问题,请参考以下文章
如何在MSAS2008中查询(xmla)OLAP目录的大小?