특정 사용자가 소유 한 모든 데이터베이스 개체를 검색 할 수 있습니까? 개체를 알아야합니다.

우리는 떠나는 사용자가 있으며 소유하고있는 모든 데이터베이스 개체를 알아야합니다. 이 정보를 제공하는 쿼리가 있습니까?



답변

이것은 당신이 찾고있는 것을 얻을 것입니다 :

;with objects_cte as
(
    select
        o.name,
        o.type_desc,
        case
            when o.principal_id is null then s.principal_id
            else o.principal_id
        end as principal_id
    from sys.objects o
    inner join sys.schemas s
    on o.schema_id = s.schema_id
    where o.is_ms_shipped = 0
    and o.type in ('U', 'FN', 'FS', 'FT', 'IF', 'P', 'PC', 'TA', 'TF', 'TR', 'V')
)
select
    cte.name,
    cte.type_desc,
    dp.name
from objects_cte cte
inner join sys.database_principals dp
on cte.principal_id = dp.principal_id
where dp.name = 'YourUser';

이것은 특정 사용자가 소유 한 객체를 가져옵니다 ( 'YourUser'물론 대체물 ). 이 쿼리가 가져 오는 객체 유형은 다음과 같습니다.

  • FN = SQL 스칼라 함수
  • FS = 어셈블리 (CLR) 스칼라 함수
  • FT = 어셈블리 (CLR) 테이블 반환 함수
  • IF = SQL 인라인 테이블 반환 함수
  • P = SQL 저장 프로 시저
  • PC = 조립 (CLR) 저장 프로 시저
  • TA = 조립 (CLR) DML 트리거
  • TF = SQL 테이블 반환 함수
  • TR = SQL DML 트리거
  • U = 테이블 (사용자 정의)
  • V =보기

답변

sa가 아닌 데이터베이스 소유자를 모두 표시하려면 다음을 수행하십시오.

SELECT suser_sname( owner_sid ) OwnerID , * FROM sys.databases where suser_sname( owner_sid ) <> 'sa'

SQL 시스템 작업 소유자가 필요한 경우 :

select s.name,l.name
from  msdb..sysjobs s
left join master.sys.syslogins l on s.owner_sid = l.sid
where l.name is not null and l.name <> 'sa'
order by l.name

답변

작업의 경우 소유자가 그룹의 일부일 수 있으며 로그인에 없을 수 있으므로 syslogins를 사용할 수 없습니다. 아래를 사용하십시오

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), *
from msdb.dbo.sysjobs