重命名EntraID安全组后,如何更新Azure SQL对应的服务器主体名称?
问题描述
- 创建了名为
sql-users的EntraID安全组,在Azure SQL服务器级创建了外部提供者登录,并在指定数据库级基于该登录创建用户,此前使用无异常。 - 将EntraID安全组重命名为
sql-readonly-users后,sys.server_principals中仍显示旧名称sql-users。 - 执行
CREATE LOGIN [sql-readonly-users] FROM EXTERNAL PROVIDER时,报错:Msg 15025, Level 16, State 8, Line 1 服务器主体 'sql-users' 已存在。 - 执行
ALTER LOGIN [sql-users] WITH NAME = [sql-readonly-users]时,报错:Msg 40597, Level 16, State 1, Line 14 外部登录不支持关键字或语句选项 'WITH_NAME_OR_PASSWORD'。 - 重启服务器方案不适用于Azure SQL,需解决如何更新服务器主体名称以匹配EntraID组的新名称。
解决方案
由于Azure SQL的外部登录(关联EntraID主体)无法直接通过ALTER LOGIN重命名,正确处理步骤如下:
备份权限与关联关系
- 查询原登录的服务器级权限:
USE master; SELECT * FROM sys.server_permissions WHERE grantee_principal_id = (SELECT principal_id FROM sys.server_principals WHERE name = 'sql-users'); - 查询目标数据库(替换为你的数据库名)内用户的权限和角色成员:
USE YourDatabase; SELECT * FROM sys.database_permissions WHERE grantee_principal_id = (SELECT principal_id FROM sys.database_principals WHERE name = 'sql-users'); SELECT * FROM sys.database_role_members WHERE member_principal_id = (SELECT principal_id FROM sys.database_principals WHERE name = 'sql-users'); - 记录所有权限、角色信息,用于后续恢复。
- 查询原登录的服务器级权限:
删除原登录与数据库用户
- 切换到目标数据库,删除关联用户:
USE YourDatabase; DROP USER [sql-users]; - 切换到master库,删除服务器级登录:
USE master; DROP LOGIN [sql-users];
- 切换到目标数据库,删除关联用户:
创建新的外部登录与数据库用户
- 创建对应新EntraID组的服务器登录:
USE master; CREATE LOGIN [sql-readonly-users] FROM EXTERNAL PROVIDER; - 在目标数据库创建关联用户:
USE YourDatabase; CREATE USER [sql-readonly-users] FOR LOGIN [sql-readonly-users];
- 创建对应新EntraID组的服务器登录:
恢复权限与角色
- 根据备份的信息,重新赋予服务器级权限,示例:
USE master; GRANT VIEW SERVER STATE TO [sql-readonly-users]; - 恢复数据库级权限和角色,示例:
USE YourDatabase; GRANT SELECT ON SCHEMA::dbo TO [sql-readonly-users]; ALTER ROLE db_datareader ADD MEMBER [sql-readonly-users];
- 根据备份的信息,重新赋予服务器级权限,示例:
注意事项
- 操作前确保无用户正在使用该登录/用户,避免会话冲突。
- 若该登录关联多个数据库,需对每个数据库重复删除用户、创建新用户并恢复权限的操作。
内容的提问来源于stack exchange,提问作者kennyh
相关产品推荐
相关产品推荐

