我有以下 SQL Server 查询:
SELECT dbp2.name AS nombre
FROM sys.server_principals AS sp JOIN
sys.database_principals AS dbp ON sp.sid=dbp.sid JOIN
sys.database_role_members AS dbrm ON dbp.principal_Id=dbrm.member_principal_Id JOIN
sys.database_principals AS dbp2 ON dbrm.role_principal_id=dbp2.principal_id
WHERE dbp.name = SUSER_NAME() AND dbp2.name NOT LIKE 'db_%';
这将返回当前用户所属的数据库角色,并且我使用此信息来验证我的应用程序内的权限(我只使用 Windows 用户)。由于未知原因,此查询对于普通用户返回空,但如果我以系统管理员用户身份运行此查询,将 SUSER_SNAME() 更改为我想要的用户,它会返回数据。经过多次测试,我发现当我以没有 sysadmin 权限的用户身份登录时,系统视图 sys.server_principals 不会返回用户自己的登录信息,因此,与其他视图的联接不会返回任何数据。Microsoft 关于此系统视图的文档指出
任何登录名都可以看到自己的登录名、系统登录名和固定的服务器角色
实际上,查询返回系统登录名和固定服务器角色,但没有用户自己的登录名。我试图找到任何线索,为什么会发生这种情况而没有运气。到目前为止,我已经在 Windows 7/8/10 或 Windows Server 2012 上测试了 SQL 2014/2016 中的这种行为,结果相同。
查询 sys.server_principals 的预期结果应该是这样的:
- 萨
- 上市
- 系统管理员
- 安全管理员
- 服务器管理员
- 设置管理员
- 进程管理员
- 磁盘管理员
- 数据库创建者
- 批量管理员
- 域\用户名
我是否必须在域级别或 SQL Server 级别为用户提供任何配置才能使此查询正常工作?提前感谢您的帮助。