能否从SQL Server通过存储过程调用Azure Data Factory管道?
从SQL Server执行Azure Data Factory管道的实现方案
以下是两种无需依赖ADF内部存储过程或SQL数据触发器的可行方案:
方案一:通过SQL存储过程调用ADF REST API
你可以在SQL Server中创建自定义存储过程,通过调用ADF的管道运行触发API来启动管道,步骤如下:
- 在Azure AD中注册服务主体,获取客户端ID、客户端密钥和租户ID,并为该主体分配ADF的
Data Factory Contributor权限。 - 在SQL Server中启用OLE自动化(需评估安全风险),或使用CLR存储过程(更安全可控)编写逻辑:
- 先向Azure AD请求访问令牌
- 携带令牌调用ADF的
createRunAPI触发管道
示例OLE自动化存储过程片段:
DECLARE @tokenObj INT, @accessToken NVARCHAR(MAX), @response NVARCHAR(MAX) -- 创建HTTP请求对象 EXEC sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @tokenObj OUT -- 请求Azure AD令牌(替换为你的AD信息) EXEC sp_OAMethod @tokenObj, 'Open', NULL, 'POST', 'https://login.microsoftonline.com/{租户ID}/oauth2/token', 'false' EXEC sp_OAMethod @tokenObj, 'SetRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded' EXEC sp_OAMethod @tokenObj, 'Send', NULL, 'grant_type=client_credentials&client_id={客户端ID}&client_secret={客户端密钥}&resource=https://management.azure.com/' EXEC sp_OAGetProperty @tokenObj, 'responseText', @accessToken OUT EXEC sp_OADestroy @tokenObj -- 调用ADF API启动管道 DECLARE @apiObj INT EXEC sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @apiObj OUT EXEC sp_OAMethod @apiObj, 'Open', NULL, 'POST', 'https://management.azure.com/subscriptions/{订阅ID}/resourceGroups/{资源组}/providers/Microsoft.DataFactory/factories/{ADF名称}/pipelines/{管道名称}/createRun?api-version=2018-06-01', 'false' EXEC sp_OAMethod @apiObj, 'SetRequestHeader', NULL, 'Authorization', 'Bearer ' + JSON_VALUE(@accessToken, '$.access_token') EXEC sp_OAMethod @apiObj, 'SetRequestHeader', NULL, 'Content-Type', 'application/json' EXEC sp_OAMethod @apiObj, 'Send', NULL, '' EXEC sp_OAGetProperty @apiObj, 'responseText', @response OUT SELECT @response AS PipelineRunResponse EXEC sp_OADestroy @apiObj
方案二:SQL Server代理作业调用PowerShell脚本
创建SQL Server代理作业,通过PowerShell步骤调用ADF的PowerShell cmdlet启动管道:
- 确保SQL Server代理服务账户有权限执行Azure PowerShell命令,或在脚本中使用服务主体认证。
- 编写PowerShell脚本:
# 服务主体认证 $clientId = "你的客户端ID" $clientSecret = ConvertTo-SecureString "你的客户端密钥" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential($clientId, $clientSecret) Connect-AzAccount -ServicePrincipal -Credential $credential -Tenant "你的租户ID" # 触发ADF管道 Invoke-AzDataFactoryV2Pipeline -ResourceGroupName "资源组名称" -DataFactoryName "ADF实例名称" -PipelineName "目标管道名称"
- 在SQL Server代理中新建作业,添加PowerShell类型的作业步骤,执行上述脚本即可。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

