【问题标题】:PowerBI API Clone Report and Dataset changing the datasourcePowerBI API 克隆报告和数据集更改数据源
【发布时间】:2023-01-14 07:28:23
【问题描述】:

我正在使用 PowerBI 客户端在 .NET 6 中开发一个应用程序来管理工作区、报告、数据集等。

这个想法是应用程序将能够创建客户端工作区,并将从主工作区继承报告和数据集。在主工作区中,将有从 PowerBI Desktop 发布的报告,因此相应的数据集也将在那里。

在克隆数据源数据库时,应相应更改用户和密码以匹配工作区客户上下文。使用以下代码,我可以在主工作区 (workspace_from_id) 上列出报告,并且可以在客户工作区 (workspace_towa_id) 上创建它们

var reports_from = pbiClient.Reports.GetReports(workspace_from_id);
foreach (Report report_from in reports_from.Value)
{
    Guid report_from_id = report_from.Id;
    CloneReportRequest cloneReportRequest = new();
    cloneReportRequest.TargetWorkspaceId = workspace_towa_id;
    cloneReportRequest.TargetModelId = dataset_towa.Id;
    cloneReportRequest.Name = report_from.Name;
    Report report_towa = pbiClient.Reports.CloneReport(workspace_from_id, report_from_id, cloneReportRequest);
}

上面代码的问题是数据集没有被克隆,源数据集被用作两个工作区的共享数据集。我已经尝试复制数据集详细信息并使用以下代码创建一个具有不同数据库的新数据集:

CreateDatasetRequest createDatasetRequest = new();
createDatasetRequest.Name = dataset_from.Name;
createDatasetRequest.Datasources = new List<Datasource>();
createDatasetRequest.Tables = new List<Table>();

Datasources datasources_from = pbiClient.Datasets.GetDatasources(workspace_from_id, dataset_from_id);
foreach (Datasource datasource_from in datasources_from.Value)
{
    //FOREACH DATASOURCE IN DATASET
    Datasource datasource_towa = new ();
    datasource_towa.Name = datasource_from.Name;
    datasource_towa.DatasourceType = datasource_from.DatasourceType;
    //CHANGE DATASOURCE CONNECTION DETAILS
    DatasourceConnectionDetails datasourceConnectiondetails = datasource_from.ConnectionDetails;
    datasourceConnectiondetails.Database = $"{Variables.reporting_db}_{group_towa.Name.ToLower()}";
    datasource_towa.ConnectionDetails = datasourceConnectiondetails;
    datasource_towa.ConnectionString = datasource_from.ConnectionString;
    datasource_towa.GatewayId = datasource_from.GatewayId;
    //ADD DATASOURCE INTO DATASET
    createDatasetRequest.Datasources.Add(datasource_towa);
}

Tables tables_from = pbiClient.Datasets.GetTables(workspace_from_id, dataset_from_id); //WORKS FOR PUSH DATASET
foreach (Table table_from in tables_from.Value)
{
    //FOREACH TABLE IN DATASET
    Table table_towa = new ();
    table_towa.Name = table_from.Name;
    table_towa.Source = table_from.Source;
    table_towa.Columns = table_from.Columns;
    table_towa.Rows = table_from.Rows;
    table_towa.Description = table_from.Description;
    //ADD TABLE INTO DATASET
    createDatasetRequest.Tables.Add(table_from);
}

上述代码的问题在于 pbiClient.Datasets.GetTables 函数不适用于普通数据集,而仅用于推送数据集。最后,由于无法获取表,以下代码失败了:

var dataset_towa = pbiClient.Datasets.PostDataset(workspace_towa_id, createDatasetRequest);

最后发现 pbiClient.Datasets.PostDataset 方法也用于发布推送数据集,如下所述:https://learn.microsoft.com/en-us/rest/api/power-bi/push-datasets/datasets-post-dataset

=======更新 13/01/2023=======

已经尝试了一些其他方法来克隆报告和数据集,例如创建数据源,但为此我们需要一个数据网关。在那种情况下,当报告已经进入像 Azure for PostgreSQL 这样的云时,我们确实需要一个网关。另一方面,我尝试创建一个虚拟网关以便将数据源创建到该网关中,但是 PowerBI Api 不支持虚拟网关,并且仅在高级容量中受支持。

所以似乎我无法将报告与数据集一起克隆并更改数据源。

有任何想法吗?

【问题讨论】:

  • 目前 API 不支持复制整个报告和数据集。您必须使用 Export Report In Group 从模板工作区下载报告,然后使用 Post Import In Group 将其上传回新工作区。
  • @AndreyNikolov 如果是这样的话,我们如何在上传之前将数据库更新为“客户数据库”?上传前应更改数据集名称,以便创建相应的数据集。这应该以编程方式完成。
  • 正如我在其他评论中所说,上传前您无法更改任何内容。所有更改都是在上传后使用 API 进行的。
  • @AndreyNikolov 你是对的,我只需要在每次更改数据库名称时更新数据源的凭据。关于如何以编程方式上传报告的任何想法?

标签: api powerbi report clone workspace


【解决方案1】:

经过大量研究,我设法从主工作区下载报告,并通过更改数据源详细信息将它们上传到客户工作区。

执行步骤:

  1. 使用 PowerBI API 导出报告/作为流导出到内存中
  2. 使用 PowerBI API 导入报告/从内存中导入为流(需要特殊处理以确保您从 HTTP 内容读取整个流/使用 SDK 不起作用)
  3. 使用 PowerBI Client SDK /pbiClient.Datasets.UpdateDatasourcesInGroup 更新报告 ConnectionDetails(需要特殊处理以仅更改服务器和数据库属性而不放置新的对象实例)
  4. 使用 PowerBI Client SDK /pbiClient.Gateways.UpdateDatasource 更新数据集的数据源(需要特殊对待以提供 JSON 凭证)

【讨论】:

    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多