比较两个用户对 SQL Server 数据库的权限?

Dan*_*ilo 4 sql-server permissions users

是否可以比较两个用户对一个 SQL Server 数据库的权限?
有什么简单的查询可以做到吗?

我问这个是因为我想知道用户 B 在数据库上是否与用户 A 具有不同或相同级别的权限。

Dav*_*son 6

这是我用来比较数据库用户之间权限的两个查询。第一个显示数据库用户具有成员资格的数据库角色(如果有)。第二个显示单独的 GRANT 和 DENY 权限。

--Database user and role memberships (if any).
SELECT u.name, r.name
FROM sys.database_principals u
LEFT JOIN sys.database_role_members rm
    ON rm.member_principal_id = u.principal_id
LEFT JOIN sys.database_principals r
    ON r.principal_id = rm.role_principal_id
WHERE u.type != 'R'
AND u.[name] = 'DBUserName';
GO

--Individual GRANTs and DENYs.
SELECT prin.[name] [User], sec.state_desc + ' ' + sec.permission_name [Permission],
    sec.class_desc Class, object_name(sec.major_id) [Securable], 
    sec.major_id [Securible_Id]
FROM [sys].[database_permissions] sec 
JOIN [sys].[database_principals] prin 
    ON sec.[grantee_principal_id] = prin.[principal_id] 
WHERE prin.[name] = 'DBUserName'
ORDER BY [User], [Permission];
GO
Run Code Online (Sandbox Code Playgroud)


Dan*_*ilo 1

在同事的帮助下,我的问题得到了答案。
编辑:
忘记提及,我们必须首先检查两个或更多用户是否具有数据库的服务器端权限,而不是检查是否有人获得数据库本身的权限。

--filter query
declare @filter nvarchar(200);

declare @DBLevelPrincipals table(
    UserName        sysname      Null
   ,RoleName        sysname      Null
   ,LoginName       sysname       Null
   ,DefDBName       sysname       Null
   ,DefScName   sysname       Null
   ,UID             int     Null
   ,SID             varbinary(85)  Null
);    
Insert into @DBLevelPrincipals
exec sys.sp_helpuser; --database-level principals in the current database

--Select * from  @DBLevelPrincipals    
with UsersPermissions as 
(
-- RESULT SET FOR ALL FIXED SERVER-ROLES
    select lgn.name collate sql_latin1_general_cp1_ci_as as 'MemberName',
    SUSER_NAME(rm.role_principal_id) collate sql_latin1_general_cp1_ci_as as 'ServerRole',
    lgn.sid as 'MemberSID', 'Server level role' as 'RoleLevel'
    from sys.server_role_members rm
    join  sys.server_principals lgn
    on rm.member_principal_id = lgn.principal_id
    where rm.role_principal_id >=3 AND rm.role_principal_id <=10 
    union
--database-level principals in the current database
    select UserName collate sql_latin1_general_cp1_ci_as,
    RoleName collate sql_latin1_general_cp1_ci_as, [SID], 'Database level role'
    from @DBLevelPrincipals
)
Select *
from UsersPermissions
where (@filter is not null and (MemberName = @filter or ServerRole = @filter))
or @filter is null
order by MemberName, RoleLevel desc
Run Code Online (Sandbox Code Playgroud)