0

我有以下 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 级别为用户提供任何配置才能使此查询正常工作?提前感谢您的帮助。

4

1 回答 1

0

经过大量尝试错误后,我发现问题出在数据库上。我执行了这个语句:

ALTER DATABASE XXX SET TRUSTWORTHY ON

这解决了我的问题。但是,这个解决方案有点苦涩,因为根据文档,这个查询应该在没有任何额外许可的情况下工作。

于 2018-06-27T16:12:41.360 回答