如何批量获取Power BI报表服务器中启用行级安全性的所有报表?
检索Power BI报表服务器中启用行级安全性(RLS)的报表
Power BI报表服务器(PBIRS)的系统视图里确实没有直接提供标识报表是否启用RLS的布尔字段,你需要通过解析报表元数据的XML内容来实现。核心逻辑是:报表的RLS配置存储在[PBIRS].[dbo].[Catalog]表的Content字段中(该字段是压缩的XML格式),我们可以解压并解析这个XML来判断是否包含RLS规则。
方法1:直接检查报表自身的RLS配置
执行以下SQL查询,可直接筛选出自身启用了RLS的报表:
SELECT c.ItemID, c.Name AS ReportName, c.Path AS ReportPath, c.CreatedDate, c.ModifiedDate FROM [PBIRS].[dbo].[Catalog] c WHERE c.Type = 2 -- Type=2代表报表类型 AND CONVERT(XML, DECOMPRESS(c.Content)).exist('/Report/Model/Roles/Role') = 1
说明:
DECOMPRESS(c.Content):将压缩的Content字段解压为可解析的XML格式。exist('/Report/Model/Roles/Role') = 1:通过XPath表达式检查报表的模型定义中是否存在RLS角色节点,只要存在该节点,说明报表启用了RLS。
方法2:包含引用共享数据集的RLS检查
如果报表引用了带RLS的共享数据集,这类报表也需要纳入统计,可使用以下查询:
WITH ReportDSRefs AS ( SELECT c.ItemID AS ReportID, c.Name AS ReportName, c.Path AS ReportPath, dsref.ReferencedID AS DatasetID FROM [PBIRS].[dbo].[Catalog] c JOIN [PBIRS].[dbo].[DatasetReferences] dsref ON c.ItemID = dsref.ItemID WHERE c.Type = 2 ), DatasetRLS AS ( SELECT ItemID AS DatasetID, Name AS DatasetName FROM [PBIRS].[dbo].[Catalog] WHERE Type = 8 -- Type=8代表共享数据集 AND CONVERT(XML, DECOMPRESS(Content)).exist('/Model/Roles/Role') = 1 ) SELECT DISTINCT rd.ReportID, rd.ReportName, rd.ReportPath, dr.DatasetName AS ReferencedRLSDataset FROM ReportDSRefs rd JOIN DatasetRLS dr ON rd.DatasetID = dr.DatasetID UNION ALL -- 合并自身带RLS的报表 SELECT ItemID AS ReportID, Name AS ReportName, Path AS ReportPath, NULL AS ReferencedRLSDataset FROM [PBIRS].[dbo].[Catalog] WHERE Type = 2 AND CONVERT(XML, DECOMPRESS(Content)).exist('/Report/Model/Roles/Role') = 1
说明:
- 第一个CTE
ReportDSRefs获取所有报表关联的共享数据集ID。 - 第二个CTE
DatasetRLS筛选出启用了RLS的共享数据集。 - 通过
UNION ALL合并两类报表:自身带RLS的报表、引用带RLS共享数据集的报表,确保结果无遗漏。
注意事项
- 确保执行查询的账号拥有
PBIRS数据库的读取权限(至少对Catalog和DatasetReferences表有SELECT权限)。 - 若部分旧版本PBIRS的XML结构略有差异,可先解压一个已知带RLS的报表
Content字段,查看实际XML结构后调整XPath表达式。
内容的提问来源于stack exchange,提问作者Kokkie
相关产品推荐
相关产品推荐

