web-dev-qa-db-ja.com

SQL Serverデータベースの2人のユーザーの権限を比較しますか?

1つのSQL Serverデータベースで2人のユーザーの権限を比較することはできますか?
それを行う簡単なクエリはありますか?

ユーザーBがデータベースでユーザーAと異なるまたは同じレベルの権限を持っているかどうかを確認したいので、これを求めています。

3
Danilo

同僚の助けを借りて、私は私の質問に答えを得ました。
編集:
言及するのを忘れて、2人以上のユーザーがデータベースに対してサーバー側のアクセス許可を持っているかどうかを最初に確認し、確認するよりもデータベース自体に対するアクセス許可を誰かが持っているかどうか確認する必要がありました。

--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
1
Danilo

データベースユーザー間の権限を比較するために使用した2つのクエリを次に示します。 1つ目は、データベースユーザーがメンバーシップを持っているデータベースロール(存在する場合)を示しています。 2番目は、個々の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
5
Dave Mason

また、sp_helploginsを実行する権限がない場合は、次のクエリを使用できます。

/*
    Ref: https://docs.Microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-database-permissions-transact-sql
*/
select
     s.name             as 'Schema'
    ,o.name             as Object
    ,dp.name            as user_group_name
    ,p.class_desc       as class
    ,p.permission_name  as permission
    ,p.state_desc       as state
    ,case major_id
        when 0 then state_desc + ' ' + permission_name + ' to [' + dp.name + ']' COLLATE LATIN1_General_CI_AS
        else state_desc + ' ' + permission_name + ' on ['+ s.name + '].[' + o.name + '] to [' + dp.name + ']' COLLATE LATIN1_General_CI_AS
    end as [how granted]
from
              sys.database_permissions  as p
    left join sys.all_objects           as o    on p.major_id = o.object_id
    left join sys.schemas               as s    on o.schema_id = s.schema_id
    left join sys.database_principals   as dp   on p.grantee_principal_id = dp.principal_id
where p.major_id >= 0 -- Exclude system objects
order by 1, 2, 3, 4, 5, 6
1
ajeh

ログインを比較するときは、次のspを使用できます

exec sp_helplogins 'loginname'

https://msdn.Microsoft.com/en-us/library/ms190304.aspx

使用できる現在のデータベースのユーザーを比較するため

EXEC sp_helpuser 'username'

https://msdn.Microsoft.com/en-us/library/ms187732.aspx

1