【问题标题】:How to view the roles and permissions granted to any database user in Azure SQL server instance?如何查看授予 Azure SQL Server 实例中任何数据库用户的角色和权限?
【发布时间】:2015-09-16 05:24:19
【问题描述】:

您能否指导我如何查看授予 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');

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

你能帮我解决这个问题吗?

【问题讨论】:

标签: sql-server azure azure-sql-database azure-sql


【解决方案1】:

根据 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;

根据Managing Databases and Logins in Azure SQL Database,loginmanager 和 dbmanager 角色是 Azure SQL 数据库中可用的两个服务器级安全角色。 loginmanager 角色拥有创建登录的权限,而 dbmanager 角色拥有创建数据库的权限。您可以使用上面对 ma​​ster 数据库的查询来查看哪些用户属于这些角色。您还可以在连接到每个用户数据库时使用相同的查询(减去过滤谓词)来确定用户的角色成员身份。

【讨论】:

    【解决方案2】:

    要查看分配给用户的数据库角色,可以使用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;  
    

    【讨论】:

    • 黄金。救了我。谢谢
    【解决方案3】:

    基于 @tmullaney 的回答,您还可以在 sys.objects 视图中离开 join,以便在对象被授予显式权限时获得洞察力。确保使用左连接:

    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)
    

    【讨论】:

    • 当被授予权限的对象是 SCHEMA 时,这不会按预期工作。当 class_desc = "SCHEMA" 时,您还必须 LEFT JOIN 到 sys.schemas
    【解决方案4】:

    如果您想查找对象名称,例如特定用户有权访问的表名和存储过程,请使用以下查询:

    SELECT pr.principal_id, pr.name, pr.type_desc, 
        pr.authentication_type_desc, pe.state_desc, pe.permission_name, OBJECT_NAME(major_id) objectName
    FROM sys.database_principals AS pr
    JOIN sys.database_permissions AS pe ON pe.grantee_principal_id = pr.principal_id
    --INNER JOIN sys.schemas AS s ON s.principal_id =  sys.database_role_members.role_principal_id 
         where pr.name in ('youruser1','youruser2') 
    

    【讨论】:

    • 根据您发布的帖子,我建议您花一些时间阅读Help Center 中的文档,以便您有最好的机会回答您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2011-10-05
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多