SSIS中刷新Power BI数据集

news2024/11/25 20:29:19

前面介绍过了怎么在Azure云中刷新Power BI数据集,感兴趣的可以阅读

数据工厂中刷新PowerBI数据集

数据工厂刷新PowerBI数据集2

但有很多公司可能并没有完全上云,比如某些公司还在使用SSIS调用ETL工程,那么有没有办法在本地也实现执行完SSIS包后就刷新数据呢?

之前有介绍过使用python来刷新Power BI数据集,感兴趣的可以阅读

使用Python连接PowerBI数据集

当PowerBI遇到了Python

当然,除了使用python,还可以使用power shell 来刷新Power BI数据集,本文也将基于python和power shell来介绍怎么在ssis中实现刷新Power BI数据集

应用设置

创建应用

首先仍然是先创建一个应用,在这里要注意先前的创建应用的网址微软已经弃用了,最新的可以Power BI嵌入式操场[1]查找

目前是

国际:Onboarding Embed Tool (powerbi.com)[2]

国内:Onboarding Embed Tool (powerbi.cn)[3]

选择为客户创建

选择权限,如果我们只需要刷新数据集,只勾选读写数据集权限即可

后面工作区可以不用创建,创建完应用后,登录到Azure门户

国际:https://portal.azure.com

国内:https://portal.azure.cn

登录后找到应用注册,然后找到刚注册的应用程序,添加权限,选择PowerBI,委托的权限,选择Dataset.ReadWrite.All

添加完权限后授权为管理员同意确认

也可以在Azure中创建应用,然后再添加权限

创建安全组

Azure门户中选择Azure Active Directory,然后选择组

创建安全组,创建工作组的时候添加成员,成员就是我们先前创建的应用

管理门户设置

登录Power BI门户,然后设置,管理门户,添加上面创建的安全组,之后返回工作区,在工作区中添加安全组

使用python刷新Power BI数据集

使用python刷新数据集有很多现在的库来获取token,当然也可以使用最原始的方式,使用requests库发送请求。新建python脚本,命名为refreshDataset.py

import requests 
data = {
    "client_id": "",
    "client_secret": "",
    "grant_type": "",
    "resource": "https://analysis.windows.net/powerbi/api"
}
tenantId = "60c3ffd8-1d3e-40a0-bfb7-83f5388cf0e2"
group = ""
dataset = ""
url = "https://login.microsoftonline.com/" + tenantId + "/oauth2/token"
res = requests.post(url, data=data)
access_token = res.json().get('access_token')
header = {'Authorization': f'Bearer {access_token}'}

refresh_url = 'https://api.powerbi.cn/v1.0/myorg/groups/' + group + '/datasets/' + dataset + '/refreshes'
r = requests.post(url=refresh_url, headers=header)

记事本创建bat文件,这里要注意另存时的编码为ansi

cd C:\Users\muxiaoqi\Desktop
start python refreshDataset.py
exit

接下来就是最后一步在SSIS中创建执行进程任务,选择bat文件所在路径即可

PowerShell

首先要确保电脑上已安装Power Shell,如果是win10以上版本则无需再安装,但仍需安装一些模块

安装Power BI Cmdlet,文档如下:

Power BI Cmdlet 引用|微软学习 (microsoft.com)[4]

Install-Module -Name MicrosoftPowerBIMgmt

安装 Azure Az Power Shell,文档如下

安装 Azure Az PowerShell 模块|微软学习 (microsoft.com)[5]

Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force

虽然具体代码不同,但代码逻辑和python是一样的,都是先获取token,然后请求API刷新数据,并且需要把执行命令写入bat文件中,然后SSIS调用该bat命令。

以下代码为github上的代码,原文如下:

Automate Power BI Dataset Refresh using PowerShell (thirdrock.com.au)[6]

#AUTHOR: 3rd Rock Business Solutions 

$dataset = "bXXXXXX-XXXX-XXXX-XX-XXXXXXbb4"
$groupID = "6cXXXXX-XXXX-XXXX-XXXX-XXXXXX0374" #WorkSpace ID 

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$clientid = "7dXXX-XXXX-XXXX-XXXXX-XXXXXXa4c9" 
$clientsecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo"
$scope = "https://analysis.windows.net/powerbi/api/.default"
$tenantid = "06XXXXX-XXXX-XXXX-XXXXX-XXXXXXXXdd75"

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Type", "application/x-www-form-urlencoded")
$body = "client_id=$clientid&client_secret=$clientsecret&scope=$scope&grant_type=client_credentials"


try 
{

    $response = Invoke-RestMethod "https://login.microsoftonline.com/$tenantid/oauth2/v2.0/token" -Method 'POST' -Headers $headers -Body $body
    $token = $response.access_token
    $token = "Bearer $token"

    # Building Rest API header with authorization token
    $authHeader = @{
       'Content-Type'='application/json'
       'Authorization'= $token
    }

    $groupsPath = ""
    if ($groupID -eq "me") {
        $groupsPath = "myorg"
    } else {
        $groupsPath = "myorg/groups/$groupID"
    }
    
    # Trigger refresh of the dataset
    $uri = "https://api.powerbi.com/v1.0/$groupsPath/datasets/$dataset/refreshes"
    Invoke-RestMethod -Uri $uri –Headers $authHeader –Method POST

    $DateTime = Get-Date -Format G
    Write-Host "Job Refresh Started at $DateTime"
    Start-Sleep -s 30

    # Check the status 
    $count = 1
    $success = 0
    $statusURL = "https://api.powerbi.com/v1.0/$groupsPath/datasets/$dataset/refreshes"
    while($count -le 50)
    {
        #get job status
        $response = Invoke-RestMethod $statusURL -Method 'GET' -Headers $authHeader
        $status = $response.value[0].status
        $DateTime = Get-Date -Format G

        Write-Host "$count. Dataset Refresh Status: $status at $DateTime"
        $count = ++$count

        if($status -eq "Completed")
        {
            $success = 1
            break
        }
        elseif($status -eq "Failed")
        {
            throw $_.Exception
            break
        }

        Start-Sleep -s 60
    }

    if($success -eq 0)
    {
        #Refresh token valid for an hour
        Write-Host "Program aborded. The job has been running for more than an hour. Please monitor the job directly in the powerbi portal"
    }


}
 catch {
    Write-Host "Status Code:" $_.Exception.Response.StatusCode.value__ 
    Write-Host "Status Description:" $_.Exception.Response.StatusDescription
    Write-Host "Error" $_
    Write-Host $_.ScriptStackTrace
    Write-Host "Error occurred due to previous job has not been finished yet."
    throw $_.Exception
}

方法2

获取token的时候也可以使用Power BI Cmdlet封装好的方法,参考以下文章

Using SQL Server Agent & PowerShell to Refresh Power BI Dataset with REST API - Top Microsoft Dynamics and NetSuite Partner & Dynamics CRM Consultant in San Diego (alphabold.com)[7]

$clientId = "" 
$datasetId = ""
$groupId = ""
$tenantId = ""
$clientSecret = ""

$password = ConvertTo-SecureString $clientSecret -AsPlainText -Force
$Creds = New-Object pscredential $clientId, $password
Login-PowerBIServiceAccount -ServicePrincipal -Credential $Creds -Tenant $tenantId

$headers = Get-PowerBIAccessToken

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

# Refresh the dataset
$restUrl = "https://api.powerbi.com/v1.0/myorg/groups/$groupId/datasets/$datasetId/refreshes"
Invoke-RestMethod -Uri $restUrl -Headers $headers -Method POST -verbose

并且这篇文章给出了另一个思路,在sql server中创建一个job来执行Power Shell脚本,然后再创建一个存储过程根据表的变化来执行该job,当然我们可以直接将SSIS 中的ETL任务和Power Shell中数据刷新的任务直接串联起来。

注意

实际在创建应用的过程中,因为创建方式不同或者权限的不同,遇到了很多问题,有些应用必须在Power BI中加入到安全组中,有些应用则不需要,详细的区别还未找到相关的官方文档说明,再次吐槽微软的文档太不友好了。

引用链接

[1] Power BI嵌入式操场: https://microsoft.github.io/PowerBI-JavaScript/demo/v2-demo/index.html#
[2] Onboarding Embed Tool (powerbi.com): https://app.powerbi.com/embedsetup
[3] Onboarding Embed Tool (powerbi.cn): https://app.powerbi.cn/embedsetup
[4] Power BI Cmdlet 引用|微软学习 (microsoft.com): https://learn.microsoft.com/en-us/powershell/power-bi/overview?view=powerbi-ps
[5] 安装 Azure Az PowerShell 模块|微软学习 (microsoft.com): https://learn.microsoft.com/en-us/powershell/azure/install-az-ps?view=azps-9.2.0
[6] Automate Power BI Dataset Refresh using PowerShell (thirdrock.com.au): https://www.thirdrock.com.au/post/automate-power-bi-dataset-refresh-using-powershell
[7] Using SQL Server Agent & PowerShell to Refresh Power BI Dataset with REST API - Top Microsoft Dynamics and NetSuite Partner & Dynamics CRM Consultant in San Diego (alphabold.com): https://www.alphabold.com/using-sql-server-agent-powershell-to-refresh-power-bi-dataset-with-rest-api/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双11购物的凑单问题与财务凑数问题

📢作者: 小小明-代码实体 📢博客主页:https://blog.csdn.net/as604049322 📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论! 📢本文链接:https://xxmdmst.blog.csdn.n…

Chapter3 P-N Junction

3-2 热平衡状态 电流只在一个方向很容易通过,正方向很容易通过电流,负方向很不容易 正电压加在Ptype上才会有电流 就会产生如图b的现象 electron 一定要从high concentration移动到low concentration 所以两个的移动方向如图所示 靠近junction附近&…

C#中window窗体和控件

C#中window窗体和控件 布局与事件–界面的基本问题 布局 就是拉动窗体的时候,按钮也在跟着变动。 事件 //简单的计算器 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespa…

Web API事件高级部分

1、注册事件&#xff08;2种方式&#xff09; 给元素添加事件&#xff0c;称为 注册事件 或者 绑定事件 注册事件有两种方式&#xff1a;传统方式 和 监听注册方式 传统注册方式&#xff1a; 利用on开头的事件 onclick<button οnclick"alert(hi~)"></b…

供应化学试剂mPEG-Biotin,甲氧基-聚乙二醇-生物素

一&#xff1a;产品描述 1、名称 英文&#xff1a;mPEG-Biotin 中文&#xff1a;甲氧基-聚乙二醇-生物素 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Biotin PEG Methoxy PEG 4、分子量&#xff1a;可定制1k、2k、3.4k、10k、20k、5k 5、质量控制&#xff1a;95…

shell脚本四剑客--sed的应用

sed的介绍 sed是Linux下一款功能强大的非交互流式文本编辑器&#xff0c;可以对文本文件进行增、删、改、查等操作&#xff0c;支持按行、按字段、按正则匹配文本内容&#xff0c;灵活方便&#xff0c;特别适合于大文件的编辑 sed在处理文本时是逐行读取文件内容&#xff0c;…

TCP协议中的几个核心特性

目录 引言 TCP协议 &#x1f351;TCP 与 UDP 的 区别 &#x1f351;TCP客户端和服务器建立连接的三次握手 &#x1f351;TCP客户端和服务器断开连接的四次挥手 &#x1f351;滑动窗口 &#x1f351;流量控制 &#x1f351;拥塞控制 引言 还记得那个经典的图吗&#x…

TCP最大连接数调优

文章目录1、单机最大TCP连接数1.1、如何标识一个TCP连接1.2、client最大tcp连接数1.3、server最大tcp连接数1.3.1、理论连接数1.3.2、实际连接数1.4、单台服务器支撑的最大TCP并发连接数1.4.1、进程限制句柄限制查看进程句柄数限制临时修改重启后失效的修改&#xff08;不过我在…

IIC 通信协议 (二)

目录 引言 子模块设计 思路 单字节 IIC 发送模块 思路 Verilog 源码 多字节发送控制模块 思路 Verilog 源码 仿真 思路 test bench 仿真结果 参考声明 引言 本篇博文承接前文&#xff0c;继续做 IIC 通信协议 FPGA实现相关的内容。用Verilog 编写一个 IIC 通信控…

【折腾服务器 1】妖板 Intel N5105 + i226 主板安装 ESXi 7.0 教程

Catch Up 今年年初&#xff0c;开始搭建个人服务器&#xff0c;用的是一台 Dell 7010 SFF 主机&#xff0c;在上面部署了一些应用&#xff0c;例如&#xff1a;Calibre &#xff0c;Blogs &#xff0c;Minecraft Server 等。使用的是 frp 做的网络代理&#xff0c;有一台服务器…

cubeIDE开发, UART的CubeMX及HAL库实现原理及底层分析

一、UART通信协议 UART通用异步收发器(Universal Asynchronous Receiver and Transmitter)是STM32 上常用的串行通信外设&#xff0c;可以灵活地与外部设备进行全双工数据交换&#xff0c;需要注意区别&#xff1a; 【1】USART-通用同步异步收发器(Universal Synchronous Async…

<Linux线程互斥与死锁>——《Linux》

目录 1. Linux线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 互斥量的接口 初始化互斥量 销毁互斥量 互斥量加锁和解锁 互斥量实现原理探究 可重入VS线程安全 概念 常见的线程不安全的情况 常见的线程安全的情况 常见不可重入的情况 常见可重入的情况 可重…

K. Lonely Numbers(线性筛 + 差分)

Problem - 1423K - Codeforces 在数字世界中&#xff0c;如果两个不同的数字有很多共同点&#xff0c;而且每个数字都有独特的好处&#xff0c;那么它们就是朋友。 更确切地说&#xff0c;如果gcd(a,b), agcd(a,b), bgcd(a,b)能组成一个三角形的边&#xff0c;那么两个不同的数…

六、应用层(四)电子邮件

目录 4.1 电子邮件系统的组成结构 4.2 简单邮件传输协议&#xff08;SMTP&#xff09; 4.3 电子邮件格式 4.4 多用途网际邮件扩充&#xff08;MIME&#xff09; 4.5 邮局协议&#xff08;POP3&#xff09;和因特网报文存取协议&#xff08;IMAP&#xff09; 4.6 基…

小黑下午第一场面试被鸽,一切遇见随缘,继续第二场的leetcode之旅:654. 最大二叉树

小黑代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def constructMaximumBinaryTree(self, nums: Li…

SAP UI5 应用里 FlexBox 控件的设计原理

sap.m.FlexBox 控件为 flexible box layout 构建容器。VBox 控件为垂直的框布局(vertical flexible box layout)构建容器。 VBox 是一种使用的控件&#xff0c;因为它只是一个定制化的 FlexBox 控件。 VBox 包含 items 聚合&#xff0c;从 FlexBox 继承而来。 HBox 控件为水平…

字符串函数

注意&#xff1a;MySQL中&#xff0c;字符串的位置是从1开始的。 ASCII(S) 返回字符串S中的第一个字符的ASCII码值. 与第一个字符后面的其他字符无关。 SELECTASCII(Abcdfsf) FROM DUAL;CHAR_LENGTH(s) 返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同。 SELECTCHAR_LEN…

生信基础知识

1.生物数据库分类 &#xff08;1&#xff09;核酸数据库&#xff08;2&#xff09;蛋白质数据库&#xff08;3&#xff09;专用数据库 核酸数据库分为一级核酸数据库和二级核酸数据库 蛋白质数据库分为一级蛋白质数据库和二级蛋白质数据库 一级蛋白质数据库又分为蛋白质序列…

【Redis】应用问题解决

一、缓存击穿 1、什么叫缓存击穿 系统中某个查询次数很多的热点key&#xff0c;在某个时刻过期&#xff0c;而此时又正好有大量并发请求查询这个key&#xff0c;但是缓存的重建还没有完成&#xff0c;这样&#xff0c;就会有大量请求涌向后端数据库&#xff0c;使得其压力骤增…

爱了,阿里P9开源分享内部Java核心开发手册(2022版)覆盖P5到P8

这个世界唯一不变的就是变化&#xff0c; IT圈子不外如是。计算机领域一直在改变&#xff0c;从基础框架到计算设备&#xff0c;还有几乎每天都涌现出的新技术。因此&#xff0c;作为一名程序开发人员&#xff0c;我们要通过不断的学习来提高自己的技能。 所以持续学习的脚步自…