web-dev-qa-db-fra.com

Comment afficher les rôles et autorisations accordés à tout utilisateur de base de données dans une instance de serveur Azure SQL?

Pourriez-vous me guider sur la façon d'afficher les rôles/autorisations actuels accordés à tout utilisateur de base de données dans Azure SQL Database ou en général pour une instance de serveur MSSQL?

J'ai cette requête ci-dessous:

SELECT r.name role_principal_name, m.name AS member_principal_name
FROM sys.database_role_members rm 
JOIN sys.database_principals r 
    ON rm.role_principal_id = r.principal_id
JOIN sys.database_principals m 
    ON rm.member_principal_id = m.principal_id
WHERE r.name IN ('loginmanager', 'dbmanager');

J'ai en outre besoin de savoir quelles sont les autorisations accordées à ces rôles "loginmanager" et "dbmanager"?

Pourriez-vous m'aider à ce sujet?

20
user3258784

Selon la documentation MSDN pour sys.database_permissions , cette requête répertorie toutes les autorisations explicitement accordées ou refusées aux principaux de la base de données à laquelle vous êtes connecté:

SELECT DISTINCT pr.principal_id, pr.name, pr.type_desc, 
    pr.authentication_type_desc, pe.state_desc, pe.permission_name
FROM sys.database_principals AS pr
JOIN sys.database_permissions AS pe
    ON pe.grantee_principal_id = pr.principal_id;

Par Gestion des bases de données et des connexions dans Azure SQL Database , les rôles loginmanager et dbmanager sont les deux rôles de sécurité au niveau du serveur disponibles dans Azure SQL Database. Le rôle loginmanager a l'autorisation de créer des connexions et le rôle dbmanager a l'autorisation de créer des bases de données. Vous pouvez voir quels utilisateurs appartiennent à ces rôles en utilisant la requête ci-dessus sur la base de données principale . Vous pouvez également déterminer les appartenances de rôle des utilisateurs sur chacune de vos bases de données utilisateur en utilisant la même requête (moins le prédicat de filtre) lorsque vous y êtes connecté.

32
tmullaney

Pour afficher les rôles de base de données attribués aux utilisateurs, vous pouvez utiliser sys.database_role_members

La requête suivante renvoie les membres des rôles de base de données.

SELECT DP1.name AS DatabaseRoleName,   
    isnull (DP2.name, 'No members') AS DatabaseUserName   
FROM sys.database_role_members AS DRM  
RIGHT OUTER JOIN sys.database_principals AS DP1  
    ON DRM.role_principal_id = DP1.principal_id  
LEFT OUTER JOIN sys.database_principals AS DP2  
    ON DRM.member_principal_id = DP2.principal_id  
WHERE DP1.type = 'R'
ORDER BY DP1.name;  
9
Thomas

En s'appuyant sur la réponse de @ tmullaney, vous pouvez également laisser join dans la vue sys.objects pour obtenir des informations lorsque des autorisations explicites ont été accordées sur des objets. Assurez-vous d'utiliser la jointure GAUCHE:

SELECT DISTINCT pr.principal_id, pr.name AS [UserName], pr.type_desc AS [User_or_Role], pr.authentication_type_desc AS [Auth_Type], pe.state_desc,
    pe.permission_name, pe.class_desc, o.[name] AS 'Object' 
    FROM sys.database_principals AS pr 
    JOIN sys.database_permissions AS pe ON pe.grantee_principal_id = pr.principal_id
    LEFT JOIN sys.objects AS o on (o.object_id = pe.major_id)
7
brentlightsey