Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
适用于:Azure SQL 数据库
Azure SQL 托管实例
本文介绍如何使用 T-SQL Object_ID
语法在 Azure SQL 数据库和 Azure SQL 托管实例中创建显示名称不唯一的 Microsoft Entra 登录名和用户。
Microsoft Entra ID 支持服务主体身份验证。 但是,在 Microsoft Entra ID 中使用显示名称不唯一的服务主体会导致在 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
出现显示名称重复的错误,因为 Microsoft Entra ID 允许 Microsoft Entra 应用程序(服务主体)的显示名称重复,而 Azure SQL 需要唯一的名称来创建 Microsoft Entra 登录名和用户。 为了缓解此问题,用于创建登录名和用户的数据定义语言 (DDL) 语句已扩展为包含具有 WITH OBJECT_ID
子句的 Azure 资源的对象 ID。
Nota
Microsoft Entra ID 中的大多数非唯一显示名称都与服务主体相关,但有时组名称也可能不唯一。 Microsoft Entra 用户主体名称是唯一的,因为两个用户不能具有同样的用户主体。 但是,可以使用与用户主体名称相同的显示名称创建应用注册(服务主体)。
如果服务主体显示名称不是重复的,则应使用默认 CREATE LOGIN
或 CREATE USER
语句。
WITH OBJECT_ID
扩展是为解决非唯一服务主体的问题而实施的故障排除修复项。 服务主体唯一时,不建议使用它。 若对不添加后缀的服务主体使用 WITH OBJECT_ID
扩展,虽能成功运行,但将无法明确区分登录名或用户所对应的服务主体。 建议使用后缀创建别名,以唯一标识服务主体。 SQL Server 2025 及更高版本支持该 WITH OBJECT_ID
扩展。
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 myapp4466e
创建登录名 aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
。
CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER
WITH OBJECT_ID = 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
- 若要执行此 T-SQL 查询,指定的对象 ID 必须存在于 Azure 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 LOGIN
或CREATE USER
语句时,登录名或用户名必须包含由用户定义的后缀扩展的原始服务主体名称。 作为最佳做法,后缀可以包含其对象 ID 的初始部分。 例如,对象 ID 为myapp2ba6c
时使用bbbbbbbb-1111-2222-3333-cccccccccccc
为后缀。 但是,你还可以定义自定义后缀。 不需要从对象 ID 形成后缀。
建议使用这种命名约定,以便将数据库用户或登录名清晰地关联回 Microsoft Entra ID 中的对象。
Nota
该别名遵循 sysname
的 T-SQL 规范,包括最大长度为 128 个字符。 我们建议将后缀限制为对象 ID 的前 5 个字符。
Microsoft Entra ID 中的服务主体的显示名称不会同步到数据库登录名或用户别名。 运行 CREATE LOGIN
或 CREATE USER
不会影响 Azure 门户中的显示名称。 同样,修改 Microsoft Entra ID 显示名称也不会影响数据库登录名或者用户别名。
对于非唯一服务主体,请务必验证 Microsoft Entra 别名是否已绑定到正确的应用程序。 要检查是否为正确的服务主体(应用程序)创建了用户:
从 SQL 数据库中创建的用户处获取应用程序的应用程序 ID 或 Microsoft Entra 组的对象 ID。 请参见以下查询:
要从创建的用户处获取服务主体的应用程序 ID,请执行以下查询:
SELECT CAST(sid as uniqueidentifier) ApplicationID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c'
示例输出:
应用程序 ID 从指定登录名或用户名的安全标识号 (SID) 转换而来,可以通过执行下一个 T-SQL 查询并比较最后几位数字来确认,并创建日期:
SELECT SID, create_date FROM sys.server_principals WHERE NAME = 'myapp2ba6c'
示例输出:
要从创建的用户处获取 Microsoft Entra 组的对象 ID,请执行以下查询:
SELECT CAST(sid as uniqueidentifier) ObjectID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b'
示例输出:
要从创建的用户处检查 Microsoft Entra 组的 SID,请执行以下查询:
SELECT SID, createdate FROM sys.sysusers WHERE NAME = 'myappgroupd3451b'
示例输出:
要使用 PowerShell 获取应用程序的对象 ID 和应用程序 ID,请执行以下命令:
Get-AzADApplication -DisplayName "myapp2ba6c"
转到 Azure 门户,在企业应用程序或 Microsoft Entra 组资源中,分别检查应用程序 ID 或对象 ID。 查看它是否与从上一个查询获取的结果匹配。
Nota
从服务主体创建用户时,如果搭配使用 子句和 WITH OBJECT_ID
T-SQL 语句,则需要使用对象 IDCREATE
。 这与当您尝试验证 Azure SQL 中的别名时返回的 应用程序 ID 不同。 使用此验证过程,你可以标识与 Microsoft Entra ID 中的 SQL 别名关联的服务主体或组,并在使用对象 ID 创建登录名或用户时防止可能出现错误。
有关服务主体的对象 ID 的信息,请参阅服务主体对象。 你可以在“企业应用程序”下的 Azure 门户中找到应用程序名称旁列出的服务主体的对象 ID。
Advertencia
在“应用注册”概述页中获取的对象 ID 不同于在“企业应用程序”概述页中获取的对象 ID。 如果你位于“应用注册”概述页中,请选择关联的本地目录中的托管应用程序的应用程序名称,以导航至“企业应用程序”概述页上正确的对象 ID。