Power BI tietolähteiden vaihto kantapalvelimen (nimen) vaihdoksen yhteydessä?

Tässä blogissa käydään läpi, miten voidaan helposti vaihtaa datalähteet yhteen työtilaan (Workspace).

Esimerkissä käytössä on Power BI ja organisaatiossa on paljon raportteja osa keskitettyjä ja hajautettuja eli käyttäjien itsenäisesti tekemiä. Nyt SQL palvelin vaihtuu ja raporttien pitäisi toimia myös tämän jälkeen. Tietenkin tämä onnistuu käsin, mutta jos työtiloja ja niissä olevia datalähteitä on paljon, voi vaihto olla työlästä.

Jokaiseen työtilassa olevaan datamalliin, missä on käytetty vaihdettavaa palvelinta, pitää käydä vaihtamassa uusi palvelin lähteeksi ja tämän joutuu tekemään avaamalla datamalli Power BI desktopilla. Työtiloja voi olla lukuisia ja jokaista työtilaa kohden vaihdettavia datamalleja voi helposti olla kymmeniä, ellei paljon enemmän.

Miten tästä selviää ilman käsityötä ja raportointikatkoja?

Ensin pitää selvittää missä työtiloissa ja datalähteissä vanhapalvelin on käytössä. Jos nämä ei ole tiedossa helpoin tapa löytyy täältä.

Lisäksi tarvitaan admin oikeudet niihin työtiloihin mihin muutokset on tehtävä. Tämän voin antaa esimerkiksi työtilan nykyinen admin. Jos admin tunnus ei ole tiedossa löytyy se esimerkiksi myös samasta datasetistä kuin mitä käytettiin työtilojen löytämiseen.

Ensimmäisenä pitää avata PowerShell ja asentaa Power BI moduuli PowerShelliin, jos ei ole asennettuna jo, ja kirjautua sisään Power BI:n tätä kautta. Tarkemmat ohjeet täällä:

Moduuli:

Kirjautuminen Power BI:

Nyt kun muut valmistelut on tehty voidaan siirtyä asiaan. Kopioi artikkelin lopussa oleva koodi PowerShelliin ja vaihda koodissa olevien parametrien arvot (kaikki rivit missä on lopuksi #Edit)

  • $groupId on työtilan id, minkä saa joko näin(samasta datasetistä kuin millä selvitimme muutettavat datasetit ja adminit) tai sitten esimerkiksi kopioimalla se menemällä työtilaan selaimella ja kopioimalla id osoite riviltä
  • $DatasourceType tätä ei tarvitse muuttaa jos kyseessä on SQL Server. (muita määrittelyn mukaan toimivia lähteitä ovat SQL Server, Azure SQL Server, Analysis Services, Azure Analysis Services, OData Feed ja SharePoint, mutta saattaa vaatia muutoksia koodiin)
  • $Server nykyisen serverin nimi
  • $DataBase tietokannan nimi
  • $ServerNew uuden serverin nimi
  • $DataBaseNew tietokannan nimi jos tietokanta pysyy samana niin sama kuin $DataBase. Vastaavasti voidaan vaihtaa vain tietokanta pitämällä serverin nimi samana.

Koodi vaihtaa vain täsmälleen niiden datasettien lähteet joiden tyyppi, serveri ja datasetti vastaavat parametreissa olevia. Jos samasta serveristä käytetään myös toista osoitetta on se muutettava erikseen.

Lisäksi jos parametreissa esiintyy ”\” on kyseinen merkki toistettava että Json lukee sen oikein ”\\”. Eli jos ”yritys\palvelin1” niin pitää muuttaa ”yritys\\palvelin1”.

Lisää rajoituksia ja tarkempaa tietoa:

https://docs.microsoft.com/en-us/rest/api/power-bi/datasets/updatedatasources

Nyt voi ajaa koodin.

Pitäisi näyttää kutakuinkin tämän näköiseltä:

Kuvassa näkyvistä varoituksista ei tarvitse välittää.

Huomioita koodista:

  • Koodi ottaa muutettavan datasetin haltuun, mutta ajon jälkeen tämän voi käydä vaihtamassa sopivammaksi, jos sillä on merkitystä.
  • Jos työtiloja on useampia, niin vaihdetaan työtilan ID($groupId) ja ajetaan koodi uudelleen.
  • Jos muutoksen jälkeen lataa tiedoston Power BI työpöytäsovellukseen on siinä edelleen vanha datalähde. Tämä on kätevä tapa korjata tilanne, jos jotakin menee pieleen, mutta aiheuttaa myös sen, että jos datalähdettä päivitetään, joutuu sen lähteen päivittämään samalla manuaalisesti.
  • Jos ajon jälkeen tulee ilmoitus, että on ei muutettuja datasettejä (kuvassa ei ole) voi ajaa koodin uudelleen, jos tämä ei auta kannattaa datasetti käydä vaihtamassa manuaalisesti, ellei muuten tiedä mistä ongelma voisi johtua.

 

Koodi:

  1. Etsii työtilasta kaikki lähteet missä on käytetty parametreissa määriteltyjä lähteitä.
  2. Koodi ottaa datasetin haltuun tunnukselle millä sitä ajetaan.
  3. Koodi vaihtaa datasettien lähteet parametreissa määriteltyihin.
  4. Lopuksi koodi hakee vielä datasetit missä datasetin vaihto epäonnistui ja näyttää näiden ID.

#Set group ID and server paremeters
$groupId = ‘e23ec697-4f08-4f44-8818-ae3c518fbaaf’#Edit
$DatasourceType = ‘Sql’

$Server = ‘etl’ #Edit
$DataBase = ‘reportserver’ #Edit

$ServerNew = ‘etl2’ #Edit
$DataBaseNew = ‘reportserver’ #Edit

###############################
write-host(“Getting all datasources”)
$AllDataSetsinWorkspacestoNewSource = Get-PowerBIDataset -WorkspaceId “$groupId”| Foreach {
$dsId = $_.Id; Get-PowerBIDatasource -DatasetId $dsId -Scope Organization |
Where-Object {
$_.DatasourceType -eq $DatasourceType -and ($_.ConnectionDetails.Server -eq “$Server” -and $_.ConnectionDetails.Database -eq $database)
} | Foreach { $dsId }
}
write-host(“Got datasources:” + $AllDataSetsinWorkspacestoNewSource.count)
write-host(“$AllDataSetsinWorkspacestoNewSource”)

#Takeover datasets
write-host(“Takeover datasets”)
$AllDataSetsinWorkspacestoNewSource | Foreach {
$datasetId = $_.Guid;
Invoke-PowerBIRestMethod -Url “groups/$groupId/datasets/$datasetId/Default.TakeOver” -Method Post;
}

#Create Body for change sources
$updateDetails= ‘{
“updateDetails”: [
{
“datasourceSelector”: {
“datasourceType”: “‘+$DatasourceType+'”,
“connectionDetails”: {
“server”: “‘+$Server+'”,
“database”: “‘+$database+'”
}
},
“connectionDetails”: {
“server”: “‘+$ServerNew+'” ,
“database”: “‘+$DataBaseNew+'”
}
}

]
}’

#Change sources
write-host(“Change sources and refresh”)

$AllDataSetsinWorkspacestoNewSource | Foreach {
$datasetId = $_.Guid;
Invoke-PowerBIRestMethod -Url “groups/$groupId/datasets/$datasetId/Default.UpdateDatasources” -Body $updateDetails -Method Post;
Invoke-PowerBIRestMethod -Url “datasets/$datasetId/refreshes” -Method Post;
}
write-host(“All Changes done”)

#Get datasets that did not change
write-host(“Get not Changed datasets”)
$AllDataSetsinWorkspacestoNewSource = Get-PowerBIDataset -WorkspaceId “$groupId”| Foreach {
$dsId = $_.Id; Get-PowerBIDatasource -DatasetId $dsId -Scope Organization |
Where-Object {$_.DatasourceType -eq $DatasourceType -and ($_.ConnectionDetails.Server -eq $Server -and $_.ConnectionDetails.Database -eq $DataBase)} | Foreach { $dsId }
}

write-host(“Got all not changed datasources:” + $AllDataSetsinWorkspacestoNewSource.count)
write-host(“$AllDataSetsinWorkspacestoNewSource”)
write-host(“All done”)

################