【问题标题】:How to list role members in SQL Server 2008 R2如何在 SQL Server 2008 R2 中列出角色成员
【发布时间】:2017-05-18 01:42:00
【问题描述】:

我正在使用以下 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

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

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

我想我还应该问一下sys.database_role_members 表是否实际上包含一个角色的所有成员?

【问题讨论】:

  • @Mihai - 您提供的链接中发布的代码与我的问题中发布的代码相同,只是它对服务器的每个数据库都执行此操作并且不回答我的问题。

标签: sql sql-server-2008-r2


【解决方案1】:

我已经弄清楚发生了什么。

当我查询角色成员时,我将输出与角色属性对话框中列为角色成员的 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

上述查询使用递归 CTE 将角色扩展为它的用户成员。

【讨论】:

    【解决方案2】:

    这是另一种方式

    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
    

    【讨论】:

    • 我找这个查询很久了!这正是我所需要的!谢谢!
    【解决方案3】:

    试试这个

    ;with ServerPermsAndRoles as
    (
        select
            spr.name as principal_name,
            spr.type_desc as principal_type,
            spm.permission_name collate SQL_Latin1_General_CP1_CI_AS as security_entity,
            'permission' as security_type,
            spm.state_desc
        from sys.server_principals spr
        inner join sys.server_permissions spm
        on spr.principal_id = spm.grantee_principal_id
        where spr.type in ('s', 'u')
    
        union all
    
        select
            sp.name as principal_name,
            sp.type_desc as principal_type,
            spr.name as security_entity,
            'role membership' as security_type,
            null as state_desc
        from sys.server_principals sp
        inner join sys.server_role_members srm
        on sp.principal_id = srm.member_principal_id
        inner join sys.server_principals spr
        on srm.role_principal_id = spr.principal_id
        where sp.type in ('s', 'u')
    )
    select *
    from ServerPermsAndRoles
    order by principal_name
    

    (或)

    SELECT p.name, o.name, d.*
    FROM sys.database_principals AS p
    JOIN sys.database_permissions AS d ON d.grantee_principal_id = p.principal_id
    JOIN sys.objects AS o ON o.object_id = d.major_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多