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

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

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 身份验证,可以使用两个命令行开关之一。

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

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

ActiveDirectoryDefault

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

ActiveDirectoryIntegrated

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

ActiveDirectoryPassword

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

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

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

ActiveDirectoryInteractive

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

ActiveDirectoryManagedIdentity

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

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

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

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

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

ActiveDirectoryServicePrincipal

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

Microsoft Entra 身份验证的环境变量

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

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

SQLCMDCLIENTID

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