未创建LOGIN/USER的Entra ID可登录Azure SQL?如何验证权限?
问题分析与解决方案
现象原因
你遇到的情况大概率是SSMS 19.0.2的凭据缓存/复用机制导致的:之前用admin@mycompanydev.onmicrosoft.com登录过SSMS,系统缓存了该账号的凭据,当你尝试用littlebird账号登录时,SSMS自动复用了缓存的管理员凭据,从而获得了数据库访问权限。
验证Entra ID数据库访问权限的方法
1. 清除SSMS凭据后重新验证
彻底清除缓存的凭据,确保登录时使用的是littlebird的真实身份:
- 打开Windows凭据管理器(控制面板 → 用户账户 → 凭据管理器 → Windows凭据)
- 删除所有包含
mycompanydev.onmicrosoft.com或你的Azure SQL服务器名称的凭据条目 - 关闭并重新打开SSMS,选择对应Entra ID登录方式(如「Azure Active Directory - 通用与MFA」),输入
littlebird的账号密码,不要勾选「记住我的凭据」,尝试连接。若该账号无权限,会直接返回登录失败的错误。
2. 在SQL数据库中查询权限(用管理员账号执行)
通过SQL语句直接验证littlebird是否存在对应的登录或用户,以及是否通过组继承权限:
检查服务器级LOGIN(在master数据库执行):
SELECT name, type_desc FROM sys.server_principals WHERE name = 'littlebird@mycompanydev.onmicrosoft.com';若结果为空,说明该账号没有服务器级登录权限。
检查数据库级USER(在目标非master数据库执行):
SELECT name, type_desc FROM sys.database_principals WHERE name = 'littlebird@mycompanydev.onmicrosoft.com';若结果为空,说明该账号没有对应数据库的用户权限。
检查是否通过Entra组继承权限:
-- 服务器级组成员关系 SELECT sp.name AS 组名称, sp.type_desc, sl.name AS 成员账号 FROM sys.server_principals sp JOIN sys.server_role_members srm ON sp.principal_id = srm.role_principal_id JOIN sys.server_principals sl ON srm.member_principal_id = sl.principal_id WHERE sl.name = 'littlebird@mycompanydev.onmicrosoft.com'; -- 数据库级组成员关系 SELECT dp.name AS 组名称, dp.type_desc, dl.name AS 成员账号 FROM sys.database_principals dp JOIN sys.database_role_members drm ON dp.principal_id = drm.role_principal_id JOIN sys.database_principals dl ON drm.member_principal_id = dl.principal_id WHERE dl.name = 'littlebird@mycompanydev.onmicrosoft.com';若有结果返回,说明
littlebird属于某个被授予SQL权限的Entra组。
3. 用littlebird账号直接检查身份与权限
如果清除凭据后仍能成功连接,在查询窗口执行以下语句,确认当前实际使用的身份和拥有的权限:
-- 查看当前登录的Entra ID账号 SELECT SUSER_SNAME(); -- 查看当前数据库对应的用户 SELECT USER_NAME(); -- 查看当前用户拥有的数据库权限 SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
内容的提问来源于stack exchange,提问作者user1147862
相关产品推荐
相关产品推荐

