无法将名称含冒号的Azure AD组添加到Azure SQL,是否遗漏操作?
解决Azure SQL添加含冒号的Azure AD安全组报错问题
这个问题我之前帮别人排查过,核心原因是Azure SQL会把名称里的冒号当成登录名与用户名的特殊分隔符来解析,就像传统Windows域账号里的反斜杠一样,所以直接用[SG:Developers]会让SQL Server误判主体名称,导致找不到对应的Azure AD组,抛出15007错误。
给你两个靠谱的解决办法,按优先级推荐:
方法1:用Azure AD组的对象ID创建用户(最稳定)
这种方式完全不受名称特殊字符影响,是最稳妥的方案:
- 先获取目标组的对象ID:
- 可以直接在Azure门户的组详情页找到;
- 也可以用PowerShell命令快速获取:
Get-AzureADGroup -Filter "DisplayName eq 'SG:Developers'" | Select-Object ObjectId
- 在Azure SQL中执行以下语句,把
<你的组对象ID>替换成实际值:CREATE USER [SG:Developers] FROM EXTERNAL PROVIDER WITH SID = '<你的组对象ID>', TYPE = E;这里的
TYPE = E指定这是Azure AD外部组,通过SID直接关联到Azure AD中的主体,跳过名称解析环节,彻底避免特殊字符的干扰。
方法2:用双引号包裹组名(快速临时方案)
如果不想用对象ID,可以尝试通过双引号明确告诉SQL Server这是完整的主体名称,不过前提是会话的QUOTED_IDENTIFIER设置为开启状态(默认是开启的):
- 先确认并开启设置(如果不确定的话):
SET QUOTED_IDENTIFIER ON; - 执行创建语句:
CREATE USER "SG:Developers" FROM EXTERNAL PROVIDER;这种方式通过双引号转义冒号,让SQL Server不会把它当成分隔符,但部分环境下可能因为服务器级别的设置限制失效,所以还是优先推荐方法1。
额外提醒
- 执行创建语句的账号必须拥有Azure SQL的
CONTROL权限,同时在Azure AD中能读取目标安全组的信息; - 可以执行
SELECT name, type_desc FROM sys.database_principals WHERE type = 'E';来验证用户是否成功创建。
内容的提问来源于stack exchange,提问作者Sai Puli
相关产品推荐
相关产品推荐

