web-dev-qa-db-ja.com

Azure SQL Serverインスタンスのデータベースユーザーに付与されているロールとアクセス許可を表示するにはどうすればよいですか?

Azure SQL Databaseまたは一般的なMSSQL Serverインスタンスのデータベースユーザーに付与されている現在のロール/権限を表示する方法を教えていただけますか?

以下のクエリがあります:

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');

さらに、これらのロール「loginmanager」および「dbmanager」に付与されているパーミッションを知る必要がありますか?

これを手伝ってくれませんか?

20
user3258784

sys.database_permissions のMSDNドキュメントに従って、このクエリは、接続しているデータベースのプリンシパルに明示的に許可または拒否されたすべての権限をリストします。

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;

Azure SQL Databaseでのデータベースとログインの管理 ごとに、loginmanagerロールとdbmanagerロールは、Azure SQL Databaseで使用できる2つのサーバーレベルのセキュリティロールです。 loginmanagerロールにはログインを作成する権限があり、dbmanagerロールにはデータベースを作成する権限があります。 masterデータベースに対して上記のクエリを使用すると、これらのロールに属するユーザーを表示できます。また、接続中に同じクエリ(フィルター述語を除く)を使用して、各ユーザーデータベース上のユーザーのロールメンバーシップを決定することもできます。

32
tmullaney

ユーザーに割り当てられたデータベースロールを表示するには、 sys.database_role_members を使用できます。

次のクエリは、データベースロールのメンバーを返します。

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

@ tmullaneyの答えに基づいて、sys.objectsビューに参加したままにして、オブジェクトに対する明示的なアクセス許可が付与されたときに洞察を得ることができます。必ず左結合を使用してください。

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