You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure SQL数据库迁移失败:含Always Encrypted加密数据的表迁移问题

解决Azure SQL迁移中Always Encrypted加密表的BCP错误(SqlErrorNumber=4816)

问题场景

尝试通过Azure Data Studio和Azure SQL Migration实例迁移本地SQL数据库至Azure SQL Database,其中包含带Always Encrypted加密列的表,迁移失败并抛出以下错误:

Failure happened on 'Sink' side. ErrorCode=SqlOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=A database operation failed. Please search error to get more details.,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.Data.SqlClient.SqlException,Message=Invalid column type from bcp client for colid 3.,Source=.Net SqlClient Data Provider,SqlErrorNumber=4816,Class=16,ErrorCode=-2146232060,State=4,Errors=[{Class=16,Number=4816,State=4,Message=Invalid column type from bcp client for colid 3.,},],'

解决步骤

  • 确认目标库的Always Encrypted配置
    先在Azure SQL Database中完成目标表的加密配置:

    • 创建与源表完全匹配的加密列,包括加密类型(确定性/随机化)、列主密钥、列加密密钥
    • 重点核对错误中提到的colid 3列,确保其数据类型、长度、精度与源表完全一致
  • 迁移向导中启用Always Encrypted支持
    在Azure Data Studio的迁移流程中:

    • 进入高级设置面板,勾选启用Always Encrypted数据迁移选项
    • 确保迁移工具能访问加密密钥:若使用本地密钥存储,需保证迁移代理有访问权限;若使用Azure Key Vault,需为迁移服务主体配置密钥的读取权限
  • 验证BCP工具版本兼容性

    • 确保迁移过程中使用的BCP工具为SQL Server 2016及以上版本,该版本开始支持Always Encrypted数据的导入导出
    • 避免手动指定旧版本BCP工具,让迁移向导自动选择兼容版本
  • 使用DAC包+BCP离线迁移(备选方案)
    如果在线迁移仍失败,可采用离线方式:

    1. 使用SqlPackage.exe导出包含Always Encrypted元数据的DAC包:
      SqlPackage.exe /Action:Export /SourceServerName:localhost /SourceDatabaseName:YourDB /TargetFile:YourDB.dacpac /IncludeAlwaysEncryptedMetadata:true
      
    2. 将DAC包部署到Azure SQL Database,部署时保留加密配置
    3. 使用BCP工具导入加密数据,添加-k参数保留加密状态:
      bcp YourDB.dbo.YourTable in "data.csv" -S yourazuresql.database.windows.net -d YourDB -U username -P password -k -c
      

内容的提问来源于stack exchange,提问作者Osura Dissanayake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:20:03