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
相关产品推荐
相关产品推荐

