서버/DB 수준별로 권한을 확인하는 스크립트입니다. 사용할때 적절하게 쿼리를 바꿔가며 쓰는중입니다.
--by jyoh.
--1. 로그인 수준 권한 (서버역할/보안개체) 확인
select spr.name, spr.type, spr.type_desc,
spr.default_database_name, spr.default_language_name,
spm.class_desc, spm.permission_name, spm.state_desc,
suser_name(srm.role_principal_id) as server_role_name
from sys.server_principals as spr with (nolock)
inner join sys.server_permissions as spm (nolock) on spm.grantee_principal_id = spr.principal_id
left join sys.server_role_members as srm with (nolocK) on spr.name = suser_name(srm.member_principal_id)
where 1=1--spr.name not in ()
and spr.name not like '##%'
and spr.name not like 'NT %'
and spr.name != 'public'
-- and spm.permission_name != 'CONNECT SQL'
order by spr.type,spr.name
------------------------------------------------------
------------------------------------------------------
--2. 유저 수준 권한 (데이터베이스 역할) 확인
if OBJECT_ID('tempdb..#TEST') is not null
drop table #TEST
if OBJECT_ID('tempdb..#TEST2') is not null
drop table #TEST2
create table #TEST
(server_name varchar(200), database_name varchar(500),
name varchar(500),ROLE varchar(50),type varchar(50),
type_desc varchar(50), default_schema_name varchar(500)
)
create table #TEST2
(server_name nvarchar(200), name nvarchar(500), database_name nvarchar(max)
)
Insert into #TEST
EXEC sp_msforeachdb '
SELECT @@servername,''?'' as database_name,dp.name
,dp2.name AS ROLE, dp.type, dp.type_desc,
dp.default_schema_name -- 기본스키마
FROM [?].sys.database_principals AS dp
INNER JOIN [?].sys.database_role_members AS dr
ON dp.principal_id = dr.member_principal_id
INNER JOIN [?].sys.database_principals AS dp2
ON dr.role_principal_id = dp2.principal_id
'
insert into #TEST2
select server_name,name, database_name + '('+Role+')' as databasename
from #TEST
where name not in ('public','dbo')
--and name not like '8%' and name not like '1%'
--
and database_name not in ('master','msdb','model')
order by name
select distinct server_name,name,
stuff((
select '/ '+database_name
from #Test2 b
where b.server_name =a.server_name
and b.name = a.name
for xml path('')
),1,1,'') as database_name
from #test2 a
drop table #TEST
drop table #TEST2
------------------------------------------------------
------------------------------------------------------
--3. 유저 수준 권한 (DB 보안개체/오브젝트) 확인
if OBJECT_ID('tempdb..#TEST3') is not null
drop table #TEST3
create table #TEST3
(server_name nvarchar(200), database_name nvarchar(max),name nvarchar(500),objname nvarchar(500),permission_name nvarchar(100),state_desc nvarchar(10)
)
insert into #TEST3
EXEC sp_msforeachdb '
SELECT distinct @@servername,''?'' as database_name,dpr.name,
case when dpm.major_id = 0 then ''ALL'' else OBJECT_NAME(dpm.major_id) end as object_name,
dpm.permission_name, dpm.state_desc
from [?].sys.database_principals as dpr
left join [?].sys.database_permissions as dpm on dpr.principal_id = dpm.grantee_principal_id
inner join [?].sys.database_role_members drm on dpr.principal_id = drm.member_principal_id
where permission_name != ''CONNECT''
'
select * from #test3 where database_name not in ('master','msdb' )
drop table #TEST3
'SQL Server > 스크립트' 카테고리의 다른 글
[스크립트]대량 데이터에 대한 특정 문자열 검색 및 변경 쿼리 추출 (0) | 2021.06.04 |
---|---|
[스크립트] TRN 복원 쿼리 생성 스크립트 (0) | 2021.02.22 |
[스크립트] 특정경로 Full백업 일괄 복원 (0) | 2021.02.22 |
[스크립트] ActiveSession 수집 결과 리포팅 형태로 가공 (0) | 2021.02.22 |
[스크립트] 배치잡 실패 수집 (0) | 2021.02.18 |