Power BI Vývojář

Přepojení Power BI THIN Reportu na jiný dataset

Nepříjemný sen, který se může stát skutečností. Tak bych popsal scénář, o který se tu s vámi chci podělit. Představte si, že jste připravili Power BI dataset, z něj report a publikovali jej do pracovního prostoru.

To je ještě stále běžné. Jenže přišel nový kolega, který v Power BI začíná, nerozumí ještě pořádně tomu, co znamená dataset, report, aplikace a chtěl udělat vlastní report z vašeho datasetu. Namísto toho, aby použil funkci „Create report“ z vašeho datasetu, tak si váš dataset stáhl k sobě, upravil si report dle svých potřeb v Power BI Desktop a publikoval jej zpět s jiným názvem, aby vám jej nepřepsal. Nakonec pak ještě zjistí, že z toho datasetu lze vyrobit nový report přímo v Power BI Service a postaví si další. A takto vám tedy najednou vznikly dva datasety a tři reporty.

Power BI Service Dataset in Data model

Jde o scénář, který popírá jakékoliv best practice. Bohužel se to stát může. Nemá cenu řešit příčiny nebo jak podobným situacím předcházet. Spíš si pojďme ukázat, co se v takové situaci dá dělat.

Ideálnější scénář by přeci jen vypadal tak, že by byl stále jeden dataset a z něj by všechny reporty vycházely. Byl by tedy jen jeden zdroj pravdy a jen jedno zatížení datového zdroje. To zní lépe, ne?

Power BI Service DataHub Dataset best practice

Power BI Service bohužel neumožňuje přímo nakázat reportu, aby si změnil dataset. Pokud navíc máme na jeden dataset navázáno vícero reportů, tak je další problém na světě, protože jej nelze stáhnout, upravit v Power BI Desktop a alespoň změnit connection string.

Jak je tedy možné přepojit report na jiný dataset?

Stručnou odpovědí je Power BI REST API. V rámci API se nachází tento typ callu Reports – Rebind Report In Group – REST API (Power BI Power BI REST APIs) | Microsoft Docs. Ten je totiž přesně to, co řeší náš problém.

POST https://api.powerbi.com/v1.0/myorg/groups/{groupId}/reports/{reportId}/Rebind

Pro úspěšném provedení tohoto callu je potřeba získat {groupId}, {reportId}, {datasetId} a splnit pár kritérií. {groupId} a {reportId} se zjišťují na reportu, který potřebujeme přepojit a {datasetId} na datasetu, na který budeme report přepojovat.

Získání těchto IDs je v principu nejjednodušší přes webový prohlížeč, kde mi postačí report zkrátka otevřít a podívat se do URL adresy webu.

Power BI Service report rebinding url path reportID groupID

Pro tuto ukázku máme tedy:

  • groupId = 0b6e10b5-a7ab-4d0a-a4bb-b6088eed815f
  • reportId = 4824d3a6-3e02-42ae-960d-bd0d81391186

A pro druhý report je jeho ID „f5b7e9ce-8437-4bd3-a0a6-1e5b94ec3192“. K tomu jsem si v podobném duchu zjistil datasetId, které je „add28670-b845-482f-b97b-9d0e32395591“.

Po získání těchto údajů je třeba se ještě rozhodnout, zda budu opravu provádět z pohledu Service Principal nebo z pohledu uživatele. Každá z těchto variant má rozdílný následný přístup k řešení a to hlavně z důvodu rozdílného získání přístupového tokenu, který je pro to nezbytný. V obou případech však musím splnit dvě podmínky:

  • Mám oprávnění Write v rámci mnou vybraného reportu.
  • Mám oprávnění Build v rámci datasetu, na který chci report přesunout.

Z pohledu API oprávnění potřebuji „Report.ReadWrite.All“. Za předpokladu, že splňuji všechny tyto podmínky, mohu přejít na provolání API.

Zavolání API z pohledu Service Principal

Pro toto volání využiju službu Postman, kde nejprve provedu autentifikační call, abych získal token, kterým se pak ověřím přímo proti službě Power BI Service. Tento call provedu pomocí následujícího curl:

curl --location --request POST 'https://login.microsoftonline.com/{tenantId}/oauth2/token' 
--header 'Host: login.microsoftonline.com' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id={clientId}' \
--data-urlencode 'client_secret={clientSecret} ' \
--data-urlencode 'resource=https://analysis.windows.net/powerbi/api'\

Kde jen změním {clientId}, {clientSecret} a {tenantId} za mé hodnoty. Jak je získat jsem ukazoval například v (1) Querying Power BI Datasets by DAX through Admin API | LinkedIn. A z odpovědi, která se mi navrátila si vezmu Access Token.

Power BI Service Dataset DAX Admin API Access Token

Následující call je již ten, kvůli kterému jsme potřebovali získat groupId, reportId a datasetId.

Power BI Servie Dataset Data Hub Postman API call

Curl zápis pro call:

curl --location --request POST 'https://api.powerbi.com/v1.0/myorg/groups/{groupId}/reports/{reportId}/Rebind' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {Accss Token}' \
--data-raw '{
    "datasetId":"{datasetId}"
}'

Po zavolání se mi vrátil status 200, takže vše proběhlo úspěšně. To si mohu potvrdit i v Power BI Service, kde již mám „HR kokpit v2“ navázaný na správný dataset!

Power BI Service Dataset Datahub API Call rebinding report HR
Zavolání API z pohledu Uživatele

Za předpokladu, že jsem uživatel, který splňuje výše zmíněné požadavky, tak toto mohu udělat i sám. Například pomocí PowerShellu. Kdy bude potřeba si nainstalovat PowerShell moduly (Power BI Cmdlets reference | Microsoft Docs), které pak jsou schopny spoustu věcí vyřešit za vás. Například uživatelský Access Token. Který můžeme v rámci modulu získat i jen pomocí následujícího kódu:

Login-PowerBI
$token = (Get-PowerBIAccessToken)["Authorization"]
$body = @{ "datasetId" = "TARGET_DATASET_ID" }
Invoke-WebRequest ` -Method 'Post' ` -Uri "https://api.powerbi.com/v1.0/myorg/groups/0b6e10b5-a7ab-4d0a-a4bb-b6088eed815f/reports/f5b7e9ce-8437-4bd3-a0a6-1e5b94ec3192/Rebind" ` -Headers @{ "Authorization"=$token } ` -Body ($body|ConvertTo-Json) ` -ContentType "application/json"

Po provolání prvního řádku se vám zobrazí klasické okno pro přihlášení. Poté, co se přihlásíte, PowerShell vám oznámí, do jakého Environmentu jste se přihlásili a umožní do proměnné $token uložit získaný AccessToken.

Power BI Service rebind dataset PowerShell JSON Access token API call

Do proměnné $body pak lze uložit JSON s datasetId a provolat API přes metodu Invoke-WebRequest:

Tady, stejně jako u varianty přes Service Principal, se vrátil status 200, který indikuje, že se vše povedlo. O tom nás přesvědčuje i Power BI Service, kde jsou již všechny reporty převedeny pod původní a správný dataset.

Power BI Service rebind dataset datahub best practice sample user principal
Shrnutí

Jak jsem zmínil, k podobné situaci by nemělo vůbec dojít. Vše by mělo být procesně podchycené a uživatelé proškolení. Když už však taková situace nastane, je nezbytné na ni umět reagovat. Variant vyřešení, jak jsem se snažil ukázal, je více. Buďto přes Service Principal přístup nebo přes váš osobní. Pokud řešíte takovouto situaci, doufám, že vám tento návod/příběh přijde vhod. V opačném případě vám přeji, abyste jej nikdy řešit nemuseli.

Related Posts

Privacy Preferences
When you visit our website, it may store information through your browser from specific services, usually in form of cookies. Here you can change your privacy preferences. Please note that blocking some types of cookies may impact your experience on our website and the services we offer.