我正在尝试使用 XMLA 获取 SSAS DB 中存在的角色列表。我只需要角色,不需要其他信息。
我知道有一个<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>DOMAINLOGIN1</Name>
</Member>
<Member>
<Sid>SID2</Sid>
<Name>DOMAINLOGIN2</Name>
</Member>
</Members>
</Role>
</Roles>
...
但是我只想有角色列表,没有其他任何东西。
无法在网络或 MS 网站上找到明确的解释(其中的文档对我来说非常古怪(,并希望有任何见解。
更新:我需要在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)
截图
另一种选择是使用 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"
一种选择是将此免费的开源 ASSP 程序集添加到服务器或数据库,然后运行以下命令(请参阅此示例和此处的其他与角色相关的程序集(:
CALL ASSP.DiscoverXmlMetadata("DatabaseRolesRole");
另一种选择是使用此免费的开源Visual Studio扩展BI开发人员扩展,它可以生成可以导出为PDF的角色报告。此选项的优点是它查询活动目录以递归方式展开组以查看成员。