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

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric SQL 数据库

sqlcmd 支持各种 Microsoft Entra 身份验证模型,具体取决于所安装的版本。

注意

虽然 Microsoft Entra ID 是 Azure Active Directory (Azure AD) 的新名称,但为了防止中断现有环境,Azure AD 仍保留在一些硬编码的元素中,例如 UI 字段、连接提供程序、错误代码和 cmdlet。 在本文中,这两个名称可以互换。

有关 sqlcmd 版本之间差异的详细信息,请参阅 sqlcmd 实用工具

sqlcmd (Go) 支持更多 Microsoft Entra 身份验证模型,这些模型基于 azidentity 包。 实现依赖于 go-sqlcmd 驱动程序中的 Microsoft Entra 连接器。

命令行参数

要使用 Microsoft Entra 身份验证,可以使用两个命令行开关之一。

-G 大部分与在 sqlcmd (ODBC) 中的使用相兼容。 如果提供了用户名和密码,则将使用 Microsoft Entra 密码验证进行身份验证。 如提供了用户名,则将使用 Microsoft Entra 交互式身份验证,该验证可能会显示 Web 浏览器。 如果没有提供用户名或密码,它将使用 DefaultAzureCredential,这样会尝试通过各种机制进行身份验证。

--authentication-method= 可用于指定以下身份验证类型之一。

ActiveDirectory默认

  • 有关此模式使用的身份验证类型的概述,请参阅默认 Azure 凭据
  • 如果数据库自动化脚本旨在于本地开发环境和 Azure 中的生产部署中运行,请选择此方法。 在开发环境中,你可以使用客户端密码或 Azure CLI 登录名。 如果不从开发环境更改脚本,你可以在生产部署中使用托管标识或客户端密码。
  • 设置环境变量 AZURE_TENANT_IDAZURE_CLIENT_ID 后,DefaultAzureCredential 才能开始检查环境配置并查找以下其他环境变量之一,以进行身份验证:
    • 设置环境变量 AZURE_CLIENT_SECRET 会将 DefaultAzureCredential 配置为选择 ClientSecretCredential
    • 如果未设置 AZURE_CLIENT_CERTIFICATE_PATH,设置环境变量 DefaultAzureCredential 会将 ClientCertificateCredential 配置为选择 AZURE_CLIENT_SECRET
  • 设置环境变量 AZURE_USERNAME 会将 DefaultAzureCredential 配置为选择 UsernamePasswordCredential,如果 AZURE_CLIENT_SECRETAZURE_CLIENT_CERTIFICATE_PATH 未设置。

ActiveDirectory集成

此方法目前还没有实现,将回退到 ActiveDirectoryDefault

Active Directory 密码

  • 此方法使用用户名和密码进行身份验证。 如果需要 MFA,则此方法不起作用。

  • 可以使用常用的命令行开关或 SQLCMD 环境变量来提供用户名和密码。

  • 如果没有使用用户的默认租户,请将 AZURE_TENANT_ID 环境变量设置为服务器的租户 ID。

ActiveDirectoryInteractive

此方法启动 Web 浏览器以对用户进行身份验证。

ActiveDirectoryManagedIdentity

在具有系统分配的托管标识或用户分配的托管标识的 Azure VM 上运行 sqlcmd (Go) 时,请使用此方法。 如果使用的是用户分配的托管标识,请将用户名设置为托管标识的客户端 ID。 如果使用的是系统分配的标识,请将用户名留空。

此示例演示如何使用服务分配的托管标识 (SAMI) 进行连接:

sqlcmd -S testsrv.database.windows.net -d Target_DB_or_DW --authentication-method ActiveDirectoryManagedIdentity

此示例演示如何通过添加用户分配的托管标识的客户端 ID 来连接用户分配的托管标识 (UAMI):

sqlcmd -S testsrv.database.windows.net -d Target_DB_or_DW --authentication-method ActiveDirectoryManagedIdentity -U <user-assigned-managed-identity-client-id>

ActiveDirectoryServicePrincipal

此方法将提供的用户名作为服务主体 ID 进行身份验证,并将密码作为服务主体的客户端密码。 以 <application (client) ID> 格式提供用户名。 将 SQLCMDPASSWORD 变量设置为客户端密码。 如果使用证书而不是客户端密码,请将 AZURE_CLIENT_CERTIFICATE_PATH 环境变量设置为证书文件的路径。

sqlcmd -S testsrv.database.windows.net -d Target_DB_or_DW --authentication-method ActiveDirectoryServicePrincipal -U <Application (client) ID> -P <client secret>

Microsoft Entra 身份验证的环境变量

一些 Microsoft Entra 身份验证设置没有命令行输入,并且一些环境变量是由 sqlcmdazidentity (Go) 所用的 包直接使用的。

可以设置这些环境变量,以配置 Microsoft Entra 身份验证的某些方面,并绕过默认行为。 除了上面列出的变量之外,还有下面一些特定于 sqlcmd (Go) 的变量,适用于多种方法。

SQLCMDCLIENTID

将此环境变量设置为 Microsoft Entra 中注册的应用程序标识符,该标识符被授权对 Azure SQL 数据库进行身份验证。 适用于 ActiveDirectoryInteractiveActiveDirectoryPassword 方法。