1つのSQL Serverデータベースで2人のユーザーの権限を比較することはできますか?
それを行う簡単なクエリはありますか?
ユーザーBがデータベースでユーザーAと異なるまたは同じレベルの権限を持っているかどうかを確認したいので、これを求めています。
同僚の助けを借りて、私は私の質問に答えを得ました。
編集:
言及するのを忘れて、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
データベースユーザー間の権限を比較するために使用した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
また、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
ログインを比較するときは、次のspを使用できます
exec sp_helplogins 'loginname'
https://msdn.Microsoft.com/en-us/library/ms190304.aspx
使用できる現在のデータベースのユーザーを比較するため
EXEC sp_helpuser 'username'