我正在使用Azure数据工厂,我使用SQLServer作为源,使用Postgres作为目标。目标是通过转换将30个表从SQLServer复制到Postgres中的30个表。困难的是,我有80个从和到的数据库,所有数据库都有完全相同的布局,但数据不同。每个客户有一个数据库,因此每个客户有80个自己的数据库。
链接服务不允许Postgres使用参数。每个源和目标都有一个数据集,使用模式和表名的参数。我有一个管道每个表SQLServer源和Postgres目标。我可以参数化链接服务中的SQLServer源,但不能参数化Postgres问题是,如何在不添加80个目标链接服务和80个目标数据集的情况下将80个源数据库复制到80个目标数据库?另外,我必须重复每个目标数据库的所有30个管道。
顺便说一句,我只熟悉UI,但其他任何能完成任务的东西都是可以接受的。如有任何帮助,我们将不胜感激。
有一种简单的方法可以实现这一点。本质上,您需要有一个单独的链接服务,它可以从KeyVault中读取连接字符串。然后,您可以将源和目标参数化为密钥库机密名称,只需更改机密名称即可轻松地在数据源之间切换。这依赖于将所有与连接相关的信息封装在单个连接字符串中。
我将为Postgresql提供一个简单的概述,但同样的逻辑也适用于作为源代码的MSSQL服务器。
- 为
Azure Key Vault
实现Linked Service
- 为使用密钥库存储访问url的
Azure Postgresql
添加Linked Service
,格式为:Server=your_server_name.postgres.database.azure.com;Database=your_database_name;Port=5432;UID=your_user_name;Password=your_password;SSL Mode=Require;Keepalive=600;
(建议使用服务器名称作为机密名称( - 在管道中传递这个参数,它本质上是正确的秘密名称(您也可以实现一个循环,该循环将立即接受x个元素的数组,并一次将n个元素解析到单独的管道中(
KeyVault的链接服务定义:
{
"name": "your_keyvault_name",
"properties": {
"description": "KeyVault",
"annotations": [],
"type": "AzureKeyVault",
"typeProperties": {
"baseUrl": "https://your_keyvault_name.vault.azure.net/"
}
}
}
Postgresql:的链接服务定义
{ "name": "generic_postgres_service".
"properties": {
"type": "AzurePostgreSql",
"parameters": {
"pg_database": {
"type": "string",
"defaultValue": "your_database_name"
}
},
"annotations": [],
"typeProperties": {
"connectionString": {
"type": "AzureKeyVaultSecret",
"store": {
"referenceName": "KeyVaultName",
"type": "LinkedServiceReference"
},
"secretName": "@linkedService().secret_name_for_server"
}
},
"connectVia": {
"referenceName": "AutoResolveIntegrationRuntime",
"type": "IntegrationRuntimeReference"
}
}
}
Postgresql:的数据集定义
{
"name": "your_postgresql_dataset",
"properties": {
"linkedServiceName": {
"referenceName": "generic_postgres_service",
"type": "LinkedServiceReference",
"parameters": {
"secret_name_for_server": {
"value": "@dataset().secret_name_for_server",
"type": "Expression"
}
}
},
"parameters": {
"secret_name_for_server": {
"type": "string"
}
},
"annotations": [],
"type": "AzurePostgreSqlTable",
"schema": [],
"typeProperties": {
"schema": {
"value": "@dataset().schema_name",
"type": "Expression"
},
"table": {
"value": "@dataset().table_name",
"type": "Expression"
}
}
}
}
Postgresql:的管道定义
{
"name": "your_postgres_pipeline",
"properties": {
"activities": [
{
"name": "Copy_Activity_1",
"type": "Copy",
"dependsOn": [],
"policy": {
"timeout": "7.00:00:00",
"retry": 0,
"retryIntervalInSeconds": 30,
"secureOutput": false,
"secureInput": false
},
...
... i skipped definition
...
"inputs": [
{
"referenceName": "your_postgresql_dataset",
"type": "DatasetReference",
"parameters": {
"secret_name_for_server": "secret_name"
}
}
]
}
],
"annotations": []
}
}