如何在SQL Server 2008 R2中列出角色成员

end*_*ium 19 sql sql-server-2008-r2

我正在使用以下T-SQL从我的SQL Server 2008 R2数据库中获取角色成员:

select rp.name as database_role, mp.name as database_user
from sys.database_role_members drm
  join sys.database_principals rp on (drm.role_principal_id = rp.principal_id)
  join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)
order by rp.name
Run Code Online (Sandbox Code Playgroud)

当我检查输出时,我注意到列出的唯一角色成员db_datareader是db角色 - db_datareader查询中没有列出任何用户成员.

这是为什么?我怎样才能列出我的数据库角色的用户成员?

我想我也应该问一下这个表是否sys.database_role_members真的包含了一个角色的所有成员?

end*_*ium 26

我弄清楚了发生了什么.

当我查询角色成员时,我将输出与角色属性对话框中列为角色成员的SSMS进行比较 - 这包括用户和角色,但是我的问题中列出的查询没有列出用户.我发现,当列出角色成员时,SSMS会扩展作为角色的成员以显示这些角色的成员.

以下查询复制SSMS列出角色成员的方式:

WITH RoleMembers (member_principal_id, role_principal_id) 
AS 
(
  SELECT 
   rm1.member_principal_id, 
   rm1.role_principal_id
  FROM sys.database_role_members rm1 (NOLOCK)
   UNION ALL
  SELECT 
   d.member_principal_id, 
   rm.role_principal_id
  FROM sys.database_role_members rm (NOLOCK)
   INNER JOIN RoleMembers AS d 
   ON rm.member_principal_id = d.role_principal_id
)
select distinct rp.name as database_role, mp.name as database_userl
from RoleMembers drm
  join sys.database_principals rp on (drm.role_principal_id = rp.principal_id)
  join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)
order by rp.name
Run Code Online (Sandbox Code Playgroud)

上面的查询使用递归CTE将角色扩展到其用户成员中.


小智 13

这是另一种方式

SELECT dp.name , us.name  
FROM sys.sysusers us right 
JOIN  sys.database_role_members rm ON us.uid = rm.member_principal_id
JOIN sys.database_principals dp ON rm.role_principal_id =  dp.principal_id
Run Code Online (Sandbox Code Playgroud)