Microsoft Entra 登录名和具有非统一显示名称的用户

适用于: SQL Server 2025 (17.x) Azure SQL 数据库Azure SQL 托管实例Microsoft Fabric

本文介绍如何使用 T-SQL Object_ID 语法在 Azure SQL 数据库、Fabric SQL 数据库、Azure SQL 托管实例以及 SQL Server 2025 及更高版本中创建 Microsoft Entra 登录名和具有非唯一显示名称的用户。

注释

可以在 Fabric SQL 数据库中创建用户,但不能创建登录名。

概述

Microsoft Entra ID 支持对服务主体进行身份验证。 但是,在 Microsoft Entra ID 中使用不唯一的服务主体,在 SQL Server、Azure SQL 数据库和 Azure SQL 托管实例中创建登录名或用户时会导致错误。

例如,如果应用程序 myapp 不唯一,则可能遇到以下错误:

Msg 33131, Level 16, State 1, Line 4 
Principal 'myapp' has a duplicate display name. Make the display name unique in Azure Active Directory and execute this statement again. 

尝试运行以下 T-SQL 语句时:

CREATE LOGIN [myapp] FROM EXTERNAL PROVIDER 

扩展WITH OBJECT_ID

出现 重复显示名称 错误的原因是Microsoft Entra ID 允许 Microsoft Entra 应用程序(服务主体)的重复显示名称,而 SQL Server 和 Azure SQL 需要唯一名称来创建 Microsoft Entra 登录名和用户。 为了缓解此问题,用于创建登录名和用户的数据定义语言 (DDL) 语句已扩展为包含 Azure 资源的对象 ID,并附带 WITH OBJECT_ID 子句。

注释

Microsoft Entra ID 中的大多数非统一显示名称都与服务主体相关,但有时组名称也可能非统一。 Microsoft Entra 用户主体名称是唯一的,因为两个用户不能具有相同的用户主体。 但是,可以使用与用户主体名称相同的显示名称创建应用注册(服务主体)。

如果服务主体显示名称不是重复名称,则应使用默认 CREATE LOGINCREATE USER 语句。 扩展 WITH OBJECT_ID 是实现的故障排除修复项,用于非统一服务主体。 不建议将它与唯一的服务主体一起使用。 将 WITH OBJECT_ID 扩展用于服务主体而不添加后缀将成功运行,但是为哪个服务主体创建登录名或用户并不明显。 建议使用后缀创建别名,以唯一标识服务主体。 SQL Server 2025 及更高版本支持该 WITH OBJECT_ID 扩展。

T-SQL 为非统一显示名称创建登录/用户语法

CREATE LOGIN [login_name] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = 'objectid'
CREATE USER [user_name] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = 'objectid'

使用 T-SQL DDL 可支持性扩展创建具有对象 ID 的登录名或用户,可以避免错误 33131 ,并为使用对象 ID 创建的登录名或用户指定别名。 例如,以下 T-SQL 示例使用应用程序对象 ID aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb创建myapp4466e登录。

CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER 
  WITH OBJECT_ID = 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb' 
  • 若要执行此 T-SQL 查询,指定的对象 ID 必须存在于 SQL 资源所在的Microsoft Entra 租户中。 否则, CREATE 该命令将失败并显示错误消息: Msg 37545, Level 16, State 1, Line 1 '' is not a valid object id for '' or you do not have permission.
  • 使用CREATE LOGINCREATE USER语句时,登录名或用户名必须包含由用户定义的后缀扩展的原始服务主体名称。 最佳做法是,后缀可以包含其对象 ID 的初始部分。 例如, myapp2ba6c 对于对象 ID bbbbbbbb-1111-2222-3333-cccccccccccc。 但是,还可以定义自定义后缀。 不需要从对象 ID 形成后缀。

建议使用此命名约定,以明确将数据库用户或登录与 Microsoft Entra ID 中的对象关联起来。

注释

别名遵循 T-SQL 规范 sysname,包括最大长度为 128 个字符。 建议将后缀限制为对象 ID 的前五个字符。

Microsoft Entra ID 中的服务主体的显示名称不会同步到数据库登录名或用户别名。 在 Azure 门户中运行 CREATE LOGINCREATE USER 不会影响显示名称。 同样,修改 Microsoft Entra ID 显示名称不会影响数据库登录名或用户别名。

标识为应用程序创建的用户

对于非统一服务主体,请务必验证 Microsoft Entra 别名是否绑定到正确的应用程序。 若要检查是否已为正确的服务主体创建用户(应用程序):

  1. 从在 Azure SQL 或 SQL Server 中创建的用户处,获取应用程序的 应用程序 ID 或 Microsoft Entra 组的 对象 ID。 请参阅以下查询:

    • 要从创建的用户中获取服务主体的 应用程序 ID,请执行以下查询:

      SELECT CAST(sid as uniqueidentifier) ApplicationID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c' 
      

      示例输出:

      SQL Server Management Studio(SSMS)查询输出中有关应用程序 ID 的截屏。

      应用程序 ID 是从指定登录名或用户名的安全标识号(SID)转换而来,我们可以通过执行下面的 T-SQL 查询,然后比较最后几位数字和创建日期来确认。

      SELECT SID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c' 
      

      示例输出:

      应用程序的 SID 的 SQL Server Management Studio(SSMS)查询输出的屏幕截图。

    • 若要从创建的用户获取Microsoft Entra 组 的对象 ID ,请执行以下查询:

      SELECT CAST(sid as uniqueidentifier) ObjectID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b' 
      

      示例输出:

      Microsoft Entra 组对象 ID 的 SQL Server Management Studio(SSMS)查询输出的屏幕截图。

      若要检查创建的用户的 Microsoft Entra 组的 SID,请执行以下查询:

      SELECT SID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b' 
      

      示例输出:

      SQL Server Management Studio(SSMS)查询输出组 SID 的屏幕截图。

    • 若要使用 PowerShell 获取应用程序的对象 ID 和应用程序 ID,请执行以下命令:

      Get-AzADApplication -DisplayName "myapp2ba6c"
      
  2. 转到 Azure 门户,在 企业应用程序 或Microsoft Entra 组资源中,分别检查 应用程序 ID对象 ID 。 查看它是否与从上一个查询获取的结果匹配。

注释

在从服务主体创建用户时,使用WITH OBJECT_IDCREATE时,需要对象 ID。 这不同于在尝试验证 SQL Server 中的别名时返回的应用程序 ID。 使用此验证过程,可以在 Microsoft Entra ID 中标识与 SQL 别名关联的服务主体或组,并在创建具有对象 ID 的登录名或用户时避免可能出现错误。

查找正确的对象 ID

有关服务主体的对象 ID 的信息,请参阅 服务主体对象。 可以在 企业应用程序下的 Azure 门户中找到应用程序名称旁列出的服务主体的对象 ID。

警告

“应用注册 概述”页中获取的对象 ID 不同于 在“企业应用程序 概述”页中获取的对象 ID。 如果位于 “应用注册 概述”页中,请在 本地目录应用程序名称中选择链接的托管应用程序 ,以导航到 企业应用程序 概述页上的正确对象 ID。