如何查看授予Azure SQL Server实例中任何数据库用户的角色和权限?

use*_*784 22 sql-server azure azure-sql-database

您能否指导我如何查看授予Azure SQL数据库中的任何数据库用户或一般用于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');
Run Code Online (Sandbox Code Playgroud)

我还需要知道授予这些角色"loginmanager"和"dbmanager"的权限是什么?

你能帮帮我吗?

tmu*_*ney 34

根据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;
Run Code Online (Sandbox Code Playgroud)

每个在Azure SQL数据库中管理数据库和登录,loginmanager和dbmanager角色是Azure SQL数据库中可用的两个服务器级安全角色.loginmanager角色具有创建登录的权限,dbmanager角色具有创建数据库的权限.您可以使用上面针对master数据库的查询来查看哪些用户属于这些角色.您还可以在连接到用户数据库时使用相同的查询(减去过滤器谓词)来确定用户在每个用户数据库上的角色成员身份.


Tho*_*mas 11

要查看分配给用户的数据库角色,可以使用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;  
Run Code Online (Sandbox Code Playgroud)


bre*_*sey 8

@tmullaney的答案的基础上,您还可以在sys.objects视图中保留join,以在授予对象显式权限时获得洞察力。确保使用LEFT联接:

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)
Run Code Online (Sandbox Code Playgroud)

  • 当授予权限的对象是架构时,这不会按预期工作。当 class_desc = "SCHEMA" 时,您还必须 LEFT JOIN 到 sys.schemas (2认同)