在 bcp 中使用 Microsoft Entra ID 进行身份验证

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 数据库

连接到 Azure SQL 数据库、Azure SQL 托管实例、Microsoft Fabric、Azure Synapse Analytics 或 SQL Server 2022(16.x)及更高版本中的 SQL 数据库时, 大容量复制程序实用工具(bcp) 支持多个Microsoft Entra ID 身份验证模型。

若要检查已安装 的 bcp 是否支持Microsoft Entra 身份验证,请运行 bcp --help 并验证是否 -G 显示在可用参数列表中。

平台限制

并非所有身份验证模式都可在每个平台上使用:

  • Microsoft仅 Windows 上支持 Entra 交互式身份验证。

  • Microsoft Entra 集成身份验证在 Linux 和 macOS 上需要 Microsoft ODBC Driver 18 for SQL Server(如果无法升级到驱动程序 18,则需要驱动程序 17.6.1 或更高版本)和 正确配置的 Kerberos 环境

  • Linux 和 macOS 仅支持使用访问令牌文件(-P <token_file>)进行身份验证。

Microsoft Entra 用户名和密码

提供-G,并附上-U(用户名)和-P(密码)。

以下示例将表bcptest从数据库testdbcontoso.database.windows.net导出到文件c:\last\data1.dat。 将 <password> 替换为有效的密码。

bcp bcptest out "c:\last\data1.dat" -c -S contoso.database.windows.net -d testdb -G -U alice@contoso.onmicrosoft.com -P <password>

以下示例导入相同的数据:

bcp bcptest in "c:\last\data1.dat" -c -S contoso.database.windows.net -d testdb -G -U alice@contoso.onmicrosoft.com -P <password>

Microsoft Entra 已集成

提供 -G 不带 -U-P。 当前 Windows 帐户(或 Linux/macOS 上的 Kerberos 标识)必须与 Microsoft Entra ID 联合。 在以下示例中,将 <server> 替换为您的服务器名称。

出口:

bcp bcptest out "c:\last\data2.dat" -S <server>.database.windows.net -d testdb -G -c

进口:

bcp bcptest in "c:\last\data2.dat" -S <server>.database.windows.net -d testdb -G -c

Microsoft Entra 托管服务标识

通过配置的 DSN 以系统分配或用户分配的托管身份进行身份验证。 相同的方法适用于 bcp inbcp out

Important

bcp 与它的驱动程序紧密耦合。 bcp 的主版本必须与 DSN 创建的驱动程序的主版本匹配。 若要确定 bcp 版本,请运行 bcp -v

通过 ODBC 数据源管理员配置 DSN:

  1. 按键盘上的 Windows 键。
  2. 键入 ODBC 并选择 相应的 ODBC 数据源管理员版本。
  3. 选择 “用户 DSN ”或“ 系统 DSN ”选项卡。
  4. 选择 “添加 ”并按照提示进行操作。
  5. 当系统要求提供身份验证类型时,请选择 “Azure 托管服务标识身份验证”。
  6. 对于用户分配的托管标识,请将 Object (principal) ID 标识粘贴到身份验证选项卡上的 “登录 ID ”框中。
  7. 继续按照提示完成 DSN 配置。

有关包括屏幕截图的完整演练,请参阅在 UI 中创建和编辑 DSN

使用 -D 标志指示传递给 -S 的值是 DSN。 -D-S开关可以在命令行上以任意顺序出现。

bcp bcptest out "c:\last\data1.dat" -c -D -S myDSN -d testdb

Microsoft Entra ID 访问令牌

仅适用于:Linux 和 macOS。 Windows 系统不被支持。

Linux 和 macOS 上的 bcp 17.8 及更高版本可以使用访问令牌进行身份验证。 以下示例使用 Azure CLI 检索令牌并将其写入安全临时文件。

Important

令牌文件必须是没有 BOM 的 UTF-16LE。 在不再需要文件时限制文件权限并删除该文件,如以下示例所示。

系统分配的托管标识

<server> 替换为您的服务器名称。

  1. 使用托管标识登录:

    az login --identity
    
  2. 检索令牌,将其写入安全临时文件,然后运行 bcp

    # Create a secure temporary file for the token
    tokenFile=$(mktemp)
    chmod 600 "$tokenFile"
    
    # Retrieve the access token and write it as UTF-16LE without BOM
    az account get-access-token --resource https://database.windows.net --output tsv | cut -f 1 | tr -d '\n' | iconv -f ascii -t UTF-16LE > "$tokenFile"
    
    # Run bcp with the token file
    bcp bcptest out data2.dat -S <server>.database.windows.net -d testdb -G -P "$tokenFile" -c
    
    # Clean up token file
    rm -f "$tokenFile"
    

用户分配的管理标识

  1. 使用用户分配的托管标识登录。 将 <client_id> 替换为适合您环境的有效值。

    az login --identity --username <client_id>
    
  2. 检索令牌,将其写入安全临时文件,然后运行 bcp。 将 <server> 替换为适合您环境的有效值。

    # Create a secure temporary file for the token
    tokenFile=$(mktemp)
    chmod 600 "$tokenFile"
    
    # Retrieve the access token and write it as UTF-16LE without BOM
    az account get-access-token --resource https://database.windows.net --output tsv | cut -f 1 | tr -d '\n' | iconv -f ascii -t UTF-16LE > "$tokenFile"
    
    # Run bcp with the token file
    bcp bcptest out data2.dat -S <server>.database.windows.net -d testdb -G -P "$tokenFile" -c
    
    # Clean up token file
    rm -f "$tokenFile"
    

Microsoft Entra 交互式界面

仅适用于:Windows。 不支持 Linux 和 macOS。

Microsoft Entra 交互式身份验证使用对话框进行身份验证,并支持多重身份验证(MFA)。 交互式身份验证需要 bcp版本 15.0.1000.34 或更高版本,以及 ODBC Driver 18 for SQL Server (或驱动程序 17.2 或更高版本)。

仅提供 -G-U (用户名)。 不包括 -Pbcp 提示输入密码;对于启用了 MFA 的帐户,将完成配置的 MFA 流程。

bcp bcptest out "c:\last\data1.dat" -c -S contoso.database.windows.net -d testdb -G -U alice@contoso.onmicrosoft.com

对于来自联合域的 Windows 帐户的 Microsoft Entra 用户,请在用户名中包含域(例如,joe@contoso.com):

bcp bcptest out "c:\last\data1.dat" -c -S contoso.database.windows.net -d testdb -G -U joe@contoso.com

如果 Microsoft Entra 租户中的来宾用户属于在 Azure SQL 数据库中具有数据库权限的组,请使用来宾用户别名(例如, keith0@adventure-works.com)。

获取帮助

参与编辑 SQL 文档

你是否知道你可以自行编辑 SQL 内容? 你如果这样做,不仅可以帮助改进我们的文档,还可以获得页面贡献者的殊荣。

有关详细信息,请参阅 Edit Microsoft Learn 文档