2014-01-07 10 views
10

ich die folgende T-SQL bin mit zu Rollenmitgliedern von meinem SQL Server 2008 R2-Datenbank zu erhalten:Wie zur Liste Rollenmitglieder in 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 

Wenn ich die Ausgabe untersuchen merke ich, dass die Nur Rollenmitglieder, die für db_datareader aufgeführt sind, sind db-Rollen - in der Abfrage sind keine Benutzerelemente von db_datareader aufgeführt.

Warum ist das? Wie kann ich auch die Benutzerelemente meiner db-Rollen auflisten?

Ich denke, ich sollte auch fragen, ob die Tabelle sys.database_role_members tatsächlich alle Mitglieder einer Rolle enthält?

+0

http://stackoverflow.com/questions/20956109/each-user-and-their-role-in-every-database-on-the-server/20956125# 20956125 – Mihai

+1

@Mihai - der Code in diesem Link, den Sie zur Verfügung gestellt haben, tut genau das Gleiche wie der Code in meiner Frage, außer dass es für jede Datenbank auf dem Server tut und meine Frage nicht beantwortet. – endurium

Antwort

14

Ich habe gearbeitet, was los ist.

Wenn ich die Rollenmitglieder abgefragt habe, habe ich die Ausgabe mit dem verglichen, was SSMS als Rollenmitglieder im Eigenschaftsdialog der Rolle aufgelistet hat - dies beinhaltet sowohl Benutzer als auch Rollen, aber die Benutzer wurden nicht aufgelistet in meiner Frage. Ich stelle fest, dass SSMS beim Auflisten von Rollenmitgliedern Mitglieder mit Rollen erweitert, die die Mitglieder dieser Rollen anzeigen.

Die folgende Abfrage repliziert die Art und Weise, in der SSMS Rollenmitglieder aufgeführt:

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 

Die obige Abfrage verwendet eine rekursive CTE eine Rolle zu erweitern hinein Benutzer Mitglieder ist.

3

Versuchen Sie, diese

;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 

(Oder)

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 
6

ist hier eine andere Art und Weise

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 
Verwandte Themen