如何使用DBATools连接Azure Synapse无服务器池并解决数据复制报错
解决DBATools Copy-DbaDbTableData连接Azure Synapse无服务器池的认证问题
问题原因
报错提示"Windows logins are not supported"是因为Copy-DbaDbTableData默认使用本地集成认证(Windows登录),但Azure Synapse无服务器池不支持Windows登录,必须使用Azure Active Directory (AAD) 认证方式——这和你在SSMS/ADS中使用的"AAD通用MFA"是同一认证体系。
解决步骤
你已经通过Invoke-Sqlcmd结合AAD访问令牌成功连接Synapse,只需让DBATools复用同样的认证逻辑:
- 获取AAD访问令牌(和原脚本一致):
Connect-AzAccount -TenantId [你的租户GUID] -Subscription [你的订阅GUID] $accessToken = (Get-AzAccessToken -ResourceUrl https://database.windows.net).Token
- 创建带AccessToken的Synapse连接对象:
手动指定认证方式,避免DBATools自动使用本地集成认证:
$sourceConnParams = @{ SqlInstance = "你的Synapse无服务器池名称.sql.azuresynapse.net" Database = "目标数据库名称" AccessToken = $accessToken } $synapseConn = Connect-DbaInstance @sourceConnParams
- 使用连接对象执行数据复制:
将创建好的连接实例作为-Source参数传入Copy-DbaDbTableData:
Copy-DbaDbTableData -Source $synapseConn ` -Destination "你的本地SQL实例名称" ` -Database "本地目标数据库" ` -Table "要复制的表名"
额外注意事项
- 确保本地SQL实例的认证方式允许你连接(比如Windows集成或SQL登录,根据本地环境配置)
- 检查Synapse无服务器池的防火墙规则,确认你的本地IP已被允许访问
- 升级DBATools到最新版本,旧版本可能对AAD AccessToken支持存在bug
- 若需复制多个表,可通过
-Table参数传入逗号分隔的表名,或用Get-DbaDbTable获取表对象后通过-InputObject传递
内容的提问来源于stack exchange,提问作者Autumnal Sigh
相关产品推荐
相关产品推荐

