You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server如何查询含数据库角色的所有登录名(含Windows认证)

如何在SQL Server中查看所有登录名及其数据库角色成员身份

你说得对,syslogins确实有很大局限性——它仅包含SQL Server认证的登录名,完全覆盖不到Windows域账号、本地Windows账号这类Windows认证的登录名。要同时获取两种认证类型的登录名,以及它们对应的数据库角色成员身份,你尝试的那个查询逻辑是完全正确的,我把它整理得更清晰,再拆解下各部分的作用:

SELECT 
    MEM.name AS MemberName,       -- 数据库级别的成员名称
    ROL.name AS RoleName,         -- 所属的数据库角色名称
    SP.name AS LoginName          -- 对应的服务器登录名(包含SQL/Windows两种认证)
FROM sys.database_role_members AS DRM
INNER JOIN sys.database_principals AS ROL 
    ON DRM.role_principal_id = ROL.principal_id
INNER JOIN sys.database_principals AS MEM 
    ON DRM.member_principal_id = MEM.principal_id
INNER JOIN sys.server_principals AS SP 
    ON MEM.[sid] = SP.[sid]

关键逻辑说明:

  • sys.database_role_members:存储当前数据库中角色与成员的关联关系,是整个查询的基础关联表
  • sys.database_principals:分别关联角色(ROL)和成员(MEM),用来获取角色和成员的名称
  • sys.server_principals:这是解决syslogins局限性的核心!它包含所有服务器级别的登录名(不管是SQL认证还是Windows认证),通过SID(安全标识符)将数据库级别的成员和服务器登录名绑定,这样就能完整覆盖所有登录类型了

如果需要查看所有数据库的角色成员关系(而不仅仅是当前连接的数据库),可以用系统存储过程sp_msforeachdb来遍历所有数据库,执行查询:

EXEC sp_msforeachdb '
USE [?];
SELECT 
    DB_NAME() AS DatabaseName,    -- 标记所属数据库
    MEM.name AS MemberName,
    ROL.name AS RoleName,
    SP.name AS LoginName
FROM sys.database_role_members AS DRM
INNER JOIN sys.database_principals AS ROL 
    ON DRM.role_principal_id = ROL.principal_id
INNER JOIN sys.database_principals AS MEM 
    ON DRM.member_principal_id = MEM.principal_id
INNER JOIN sys.server_principals AS SP 
    ON MEM.[sid] = SP.[sid]
'

内容的提问来源于stack exchange,提问作者ahmed_khudhair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:00:50