빠른 시작: 확장 이벤트
적용 대상: SQL Server
Azure SQL Database
Azure SQL Managed Instance
확장 이벤트는 사용자가 문제를 모니터링하고 해결하는 데 필요한 데이터를 수집할 수 있도록 하는 간단한 성능 모니터링 기능입니다. 확장 이벤트를 사용하면 성능 모니터링 및 문제 해결 목적과 관련된 데이터베이스 엔진 내부 작업에 대한 세부 정보를 볼 수 있습니다. 확장 이벤트에 대한 자세한 내용은 확장 이벤트 개요를 참조하세요.
이 문서는 확장 이벤트를 신규로 사용하고 몇 분 만에 이벤트 데이터를 보려는 SQL 관리자, 엔지니어 및 개발자를 돕는 것을 목표로 합니다.
확장 이벤트를 XEvents라고도 하며 때로는 XE일 수도 있습니다.
이 문서를 읽고 나면 다음을 할 수 있습니다.
- 예제 스크린샷을 사용하여 SSMS(SQL Server Management Studio)에서 이벤트 세션을 만드는 방법 확인
- 스크린샷을 동등한 Transact-SQL 문과 상호 연결
- SSMS 사용자 인터페이스 및 XEvents T-SQL 문 뒤에 있는 용어 및 개념을 자세히 이해
- 이벤트 세션을 테스트하는 방법 알아보기
- 다음을 포함하여 세션 결과 이해
- 결과 스토리지에 사용 가능한 옵션
- 처리된 결과와 처리되지 않은 결과 비교
- 다양한 방법과 다양한 시간 눈금으로 결과를 보기 위한 도구
- 사용 가능한 모든 이벤트를 검색하고 발견하는 방법 파악
- 확장 이벤트 시스템 뷰 간의 관계 이해
팁
코드 샘플을 포함하여 Azure SQL Database의 확장 이벤트에 대한 자세한 내용은 Azure SQL Database 및 Azure SQL Managed Instance 확장 이벤트를 참조하세요.
필수 조건
시작하려면 다음이 필요합니다.
- SSMS(SQL Server Management Studio) 다운로드합니다. 최신 버전의 SSMS를 최신 개선 및 수정과 함께 사용하는 것이 좋습니다.
- 계정에
ALTER ANY EVENT SESSION
서버 권한이 있는지 확인합니다.
확장 이벤트 관련 보안 및 사용 권한에 대한 자세한 내용은 이 문서 뒷부분에 있는 부록을 확인하세요.
SSMS의 확장 이벤트
SSMS는 완벽하게 작동하는 확장 이벤트 UI(사용자 인터페이스)를 제공합니다. T-SQL 또는 DMV(동적 관리 뷰)를 사용하지 않고도 이 UI를 사용하여 많은 시나리오를 수행할 수 있습니다.
다음 섹션에서는 확장 이벤트 세션을 만들고 보고하는 데이터를 확인하는 UI 단계를 볼 수 있습니다. 이 문서에서 단계 실습을 진행하거나 검토한 후에는 단계와 관련된 개념에 대해 읽고 더 깊이 이해할 수 있습니다.
SSMS에서 이벤트 세션 만들기
확장 이벤트 세션을 만들 때 시스템에 다음을 알릴 수 있습니다.
- 관심 있는 이벤트
- 시스템에서 사용자에게 데이터를 보고하는 방법
데모에서 새 세션 대화 상자가 열리고, 다음과 같은 네 개의 페이지를 사용하는 방법을 보여 줍니다.
- 일반
- 이벤트
- 데이터 스토리지
- 고급
텍스트 및 지원 스크린샷은 SSMS 버전마다 약간 다를 수 있지만 여전히 기본 개념에 대한 설명과 관련이 있을 것입니다.
데이터베이스 엔진 인스턴스에 연결합니다. 확장 이벤트는 Azure SQL Database 및 Azure SQL Managed Instance에서 SQL Server 2014(12.x)부터 지원됩니다.
개체 탐색기에서 관리 > 확장 이벤트를 선택합니다. Azure SQL Database에서 이벤트 세션은 데이터베이스 범위이므로 확장 이벤트 옵션은 관리가 아닌 각 데이터베이스에서 찾을 수 있습니다. 세션 폴더를 마우스 오른쪽 단추로 클릭하고 새 세션을 선택합니다. 두 개가 서로 비슷하지만 새 세션 마법사보다 새 세션 대화 상자를 사용하는 것이 좋습니다.
일반 페이지를 선택합니다. 그런 다음 세션 이름 입력란에
YourSession
또는 원하는 이름을 입력합니다. 다른 페이지에 일부 세부 정보를 입력해야 하므로 아직 확인을 선택하지 마세요.이벤트 페이지를 선택합니다.
이벤트 라이브러리 영역의 드롭다운 목록에서 이벤트 이름만을 선택합니다.
- 입력란에
sql_statement_
을(를) 입력합니다. 이렇게 하면 이름에sql_statement_
이(가) 있는 이벤트만 표시하도록 목록을 필터링합니다. - 스크롤하여 이름이
sql_statement_completed
인 이벤트를 선택합니다. - 오른쪽 화살표
>
버튼을 클릭하여 이벤트를 선택한 이벤트 상자로 옮깁니다.
- 입력란에
이벤트 페이지에서 구성 버튼을 선택합니다. 그러면 선택한 이벤트에 대한 이벤트 구성 옵션 상자가 열립니다.
필터(조건자) 탭을 선택합니다. 다음으로, 절을 추가하려면 여기를 선택합니다.
HAVING
절이 있는 모든SELECT
문을 캡처하도록 이 필터(조건자라고도 함)를 구성합니다.필드 드롭다운 목록에서
sqlserver.sql_text
을(를) 선택합니다.- 연산자로
like_i_sql_unicode_string
을(를) 선택합니다. 여기서 연산자의 이름의i
는 대소문자 무관을 뜻합니다. - 값에
%SELECT%HAVING%
을(를) 입력합니다. 여기서 백분율 기호는 모든 문자열에 대한 와일드 카드입니다.
참고 항목
필드의 두 부분으로 구성된 이름에서 sqlserver는 패키지 이름이고 sql_text는 필드 이름입니다. 이전에 선택한 sql_statement_completed 이벤트는 선택한 필드와 같은 패키지에 있어야 합니다.
- 연산자로
데이터 스토리지 페이지를 선택합니다.
대상 영역에서 대상을 추가하려면 여기를 선택합니다.
- 형식 드롭다운 목록에서
event_file
을(를) 선택합니다. 즉, 이벤트 데이터는 나중에 열고 볼 수 있는 파일에 저장됩니다. Azure SQL Managed Instance 및 Azure SQL Database에서 이벤트 파일은 Azure Storage Blob에 저장합니다.
참고 항목
SQL Server 2019(15.x)부터 SQL Server의
event_file
대상에서 Azure Blob Storage를 사용할 수 있습니다.- 형식 드롭다운 목록에서
속성 영역에서 전체 경로 및 파일 이름을 서버 파일 이름 입력란에 입력합니다. 찾아보기 단추를 사용할 수도 있습니다. 파일 이름 확장명은
xel
여야 합니다. 이 예제에서는C:\Temp\YourSession_Target.xel
을(를) 사용합니다.고급 페이지를 클릭합니다. 최대 디스패치 대기 시간을 3초로 줄입니다.
아래쪽에서 확인 버튼을 선택하여 이 이벤트 세션을 만듭니다.
개체 탐색기 돌아가서 Sessions 폴더를 열거나 새로 고치고
YourSession
에 대한 새 노드를 참조합니다. 세션이 아직 시작되지 않았습니다. 나중에 시작합니다.
SSMS에서 이벤트 세션 편집
SSMS 개체 탐색기에서 해당 노드를 마우스 오른쪽 단추로 클릭한 다음 속성을 선택하여 이벤트 세션을 편집할 수 있습니다. 동일한 다중 페이지 대화 상자가 표시됩니다.
T-SQL을 사용하여 이벤트 세션 만들기
SSMS 확장 이벤트 UI에서 다음과 같이 T-SQL 스크립트를 생성하여 이벤트 세션을 만들 수 있습니다.
- 이벤트 세션 노드를 마우스 오른쪽 단추로 클릭한 다음 세션을 > CREATE로 > 클립보드에 스크립팅을 선택합니다.
- 텍스트 편집기에 붙여넣습니다.
YourSession
에 대해 생성된 CREATE EVENT SESSION
T-SQL 문은 다음과 같습니다.
CREATE EVENT SESSION [YourSession]
ON SERVER -- For SQL Server and Azure SQL Managed Instance
-- ON DATABASE -- For Azure SQL Database
ADD EVENT sqlserver.sql_statement_completed
(
ACTION(sqlserver.sql_text)
WHERE
( [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%SELECT%HAVING%')
)
)
ADD TARGET package0.event_file
(SET
filename = N'C:\Temp\YourSession_Target.xel',
max_file_size = (2),
max_rollover_files = (2)
)
WITH (
MAX_MEMORY = 2048 KB,
EVENT_RETENTION_MODE = ALLOW_MULTIPLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 3 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
GO
이벤트 세션의 조건부 DROP
동일한 이름의 세션이 이미 있는 경우 CREATE EVENT SESSION
문 앞에 조건부로 DROP EVENT SESSION
문을 실행할 수 있습니다. 그러면 기존 세션이 삭제됩니다. 이렇게 하지 않고 동일한 이름의 세션을 만들려고 하면 오류가 발생합니다.
IF EXISTS (SELECT *
FROM sys.server_event_sessions
WHERE name = 'YourSession')
BEGIN
DROP EVENT SESSION YourSession
ON SERVER;
END
GO
T-SQL을 사용하여 이벤트 세션 시작 및 중지
이벤트 세션을 만들 때 기본값은 자동으로 실행을 시작하지 않는 것입니다. 다음 ALTER EVENT SESSION
T-SQL 문을 사용하여 언제든지 이벤트 세션을 시작하거나 중지할 수 있습니다.
ALTER EVENT SESSION [YourSession]
ON SERVER
STATE = START; -- STOP;
데이터베이스 엔진 인스턴스가 시작될 때 자동으로 시작되도록 이벤트 세션을 구성하는 옵션이 있습니다. CREATE EVENT SESSION
의 STARTUP STATE = ON
키워드를 참조하세요.
SSMS UI는 해당되는 체크박스 서버 시작 시 이벤트 세션 시작을 새 세션 > 일반 페이지에서 제공합니다.
이벤트 세션 테스트
다음 단계를 통해 이벤트 세션을 테스트합니다.
- 개체 탐색기에서 해당 서버 세션 노드를 마우스 오른쪽 단추로 클릭한 다음 세션 시작을 선택합니다.
- 이벤트 세션을 만든 동일한 서버(또는 Azure SQL Database의 동일한 데이터베이스)에 연결된 동안 다음
SELECT...HAVING
문을 두 번 실행합니다. 각 실행에 대한HAVING
절의 값을 변경하여 2에서 3 사이로 전환하는 것이 좋습니다. 이렇게 하면 결과의 차이를 볼 수 있습니다. - 세션 노드를 마우스 오른쪽 단추로 클릭하고 세션 중지를 선택합니다.
- SELECT 및 결과를 보는 방법에 대한 다음 하위 섹션을 읽어봅니다.
SELECT c.name,
COUNT(*) AS [Count-Per-Column-Repeated-Name]
FROM sys.syscolumns AS c
INNER JOIN sys.sysobjects AS o
ON o.id = c.id
WHERE o.type = 'V'
AND c.name LIKE '%event%'
GROUP BY c.name
HAVING Count(*) >= 3 --2 -- Try both values during session.
ORDER BY c.name;
완전성을 위해 선행 SELECT...HAVING
의 출력 예제는 다음과 같습니다.
/* Approximate output, 6 rows, all HAVING Count >= 3:
name Count-Per-Column-Repeated-Name
--------------------- ------------------------------
event_group_type 4
event_group_type_desc 4
event_session_address 5
event_session_id 5
is_trigger_event 4
trace_event_id 3
*/
이벤트 세션 데이터 XML로 보기
SSMS의 쿼리 창에서 다음 SELECT
문을 실행하여 세션에서 캡처한 이벤트 데이터를 확인합니다. 각 행은 하나의 이벤트 발생을 나타냅니다. CAST(... AS xml)
은(는) 열의 데이터 형식을 nvarchar에서 xml로 변경합니다. 이렇게 하면 열 값을 선택하여 더 쉽게 읽을 수 있도록 새 창에서 열 수 있습니다.
참고 항목
event_file
대상은 항상 xel
파일 이름에 숫자 부분을 삽입합니다. 다음 쿼리를 실행하려면 먼저 이 숫자 부분이 포함된 xel
파일의 실제 전체 이름을 복사하여 SELECT
문에 붙여넣어야 합니다. 다음 예제에서 숫자 부분은 _0_131085363367310000
입니다.
SELECT object_name,
file_name,
file_offset,
event_data,
'CLICK_NEXT_CELL_TO_BROWSE_XML RESULTS!' AS [CLICK_NEXT_CELL_TO_BROWSE_XML_RESULTS],
CAST(event_data AS XML) AS [event_data_XML]
-- TODO: In the SSMS results grid, click this XML cell
FROM sys.fn_xe_file_target_read_file(
'C:\Temp\YourSession_Target_0_131085363367310000.xel', NULL, NULL, NULL
);
이 쿼리는 지정된 이벤트 행의 전체 결과를 보는 두 가지 방법을 제공합니다.
SSMS에서 SELECT를 실행한 다음
event_data_XML
열에서 셀을 선택합니다.event_data
열의 셀에서 XML 문자열을 복사합니다. 메모장 같은 텍스트 편집기에 붙여넣고 파일을xml
확장명으로 저장합니다. 그런 다음 XML 데이터를 표시할 수 있는 브라우저 또는 편집기에서 파일을 엽니다.
XML 형식 이벤트 데이터
다음으로 XML 형식인 결과의 일부가 표시됩니다. 다음 XML은 간결하게 편집됐습니다. <data name="row_count">
은(는) 이전에 표시된 6개의 결과 행과 일치하는 6
값을 표시합니다. 또한 전체 SELECT
문도 볼 수 있습니다.
<event name="sql_statement_completed" package="sqlserver" timestamp="2016-05-24T04:06:08.997Z">
<data name="duration">
<value>111021</value>
</data>
<data name="cpu_time">
<value>109000</value>
</data>
<data name="physical_reads">
<value>0</value>
</data>
<data name="last_row_count">
<value>6</value>
</data>
<data name="offset">
<value>0</value>
</data>
<data name="offset_end">
<value>584</value>
</data>
<data name="statement">
<value>SELECT c.name,
COUNT(*) AS [Count-Per-Column-Repeated-Name]
FROM sys.syscolumns AS c
INNER JOIN sys.sysobjects AS o
ON o.id = c.id
WHERE o.type = 'V'
AND c.name LIKE '%event%'
GROUP BY c.name
HAVING Count(*) >= 3 --2 -- Try both values during session.
ORDER BY c.name;</value>
</data>
</event>
SSMS에 이벤트 세션 데이터 표시
SSMS UI에는 이벤트 세션에서 캡처한 데이터를 보는 데 사용할 수 있는 몇 가지 고급 기능이 있습니다. 자세한 내용은 SQL Server Management Studio에서 이벤트 데이터 보기를 참조하세요.
대상 데이터 보기 및 라이브 데이터 감시 레이블이 지정된 상황에 맞는 메뉴 옵션으로 시작합니다.
대상 데이터 보기
SSMS 개체 탐색기에서 이벤트 세션 노드 아래의 대상 노드를 마우스 오른쪽 단추로 클릭할 수 있습니다. 상황에 맞는 메뉴에서 대상 데이터 보기를 클릭합니다. SSMS가 데이터를 표시합니다.
세션에서 새 이벤트가 발생하면 디스플레이가 업데이트되지 않습니다. 하지만 대상 데이터 보기를 다시 선택할 수 있습니다.
라이브 데이터 감시
SSMS 개체 탐색기에서 이벤트 세션 노드를 마우스 오른쪽 단추로 클릭할 수 있습니다. 상황에 맞는 메뉴에서 라이브 데이터 감시를 선택합니다. SSMS는 실시간으로 계속 도착하는 수신 데이터를 표시합니다.
확장 이벤트의 용어 및 개념
다음 표에서는 확장 이벤트에 사용된 용어를 나열하고 그 의미를 설명합니다.
용어 | 설명 |
---|---|
event session |
하나 이상의 이벤트와 동작 및 대상 등 지원되는 항목에 대한 구성입니다. CREATE EVENT SESSION 문은 각 이벤트 세션을 만듭니다. 이벤트 세션을 ALTER 하여 원하는 대로 시작 및 중지할 수 있습니다.이벤트 세션은 컨텍스트에서 이벤트 세션을 의미한다는 것이 분명한 경우 세션이라고도 합니다. 이벤트 세션에 대한 자세한 내용은 확장 이벤트 세션에 설명되어 있습니다. |
event |
활성 이벤트 세션이 감시하는 시스템의 특정 항목입니다. 예를 들어 sql_statement_completed 이벤트는 지정된 T-SQL 문이 완료되는 순간을 나타냅니다. 이벤트는 기간 및 기타 데이터를 보고할 수 있습니다. |
target |
캡처한 이벤트에서 출력 데이터를 수신하는 항목입니다. 대상은 사용자에게 데이터를 표시합니다. 예를 들어 이 빠른 시작의 앞부분에서 사용된 event_file 대상과 가장 최근의 이벤트를 메모리에 유지하는 ring_buffer 대상이 있습니다.모든 종류의 대상은 모든 이벤트 세션에 사용할 수 있습니다. 자세한 내용은 확장 이벤트의 대상을 참조하세요. |
action |
이벤트에 알려진 필드입니다. 필드의 데이터가 대상으로 전송됩니다. 작업 필드는 조건자 필터와 밀접한 관련이 있습니다. |
predicate 또는 필터 |
이벤트 발생의 흥미로운 하위 집합만 대상으로 전송되도록 사용되는 이벤트 필드의 데이터 테스트입니다. 예를 들어 필터에는 T-SQL 문에 HAVING 문자열이 포함된 sql_statement_completed 이벤트 발생만 포함될 수 있습니다. |
package |
이벤트의 핵심과 관련된 항목 집합의 각 항목에 연결된 이름 한정자입니다. 예를 들어 패키지에는 T-SQL 텍스트에 대한 이벤트가 있을 수 있습니다. 하나의 이벤트는 배치 내의 모든 T-SQL에 관한 것일 수 있습니다. 한편 개별 T-SQL 문에 대한 이벤트도 있습니다. 또한 모든 T-SQL 문에 대해 started 및 completed 이벤트가 있습니다.이벤트에 적합한 필드는 이벤트가 있는 패키지에도 있습니다. 대부분의 대상은 package0 에 있으며 다른 많은 패키지의 이벤트와 함께 사용됩니다. |
확장 이벤트 시나리오 및 사용량 세부 정보
확장 이벤트를 사용하여 데이터베이스 엔진 및 쿼리 워크로드를 모니터링하고 문제를 해결하는 다양한 시나리오가 있습니다. 다음 문서에서는 잠금 관련 시나리오를 사용하는 예제를 제공합니다.
- 가장 많은 잠금이 발생한 개체 찾기
- 이 시나리오에서는 요약된(버킷화된) 형식으로 표시하기 전에 원시 이벤트 데이터를 처리하는 히스토그램 대상을 사용합니다.
- 잠금을 보유한 쿼리 판정
- 이 시나리오에서는 이벤트
sqlserver.lock_acquire
및sqlserver.lock_release
쌍이 있는 pair_matching 대상을 사용합니다.
- 이 시나리오에서는 이벤트
패키지에서 사용할 수 있는 이벤트를 검색하는 방법
다음 쿼리는 이름에 세 개의 sql
문자열이 포함된 사용 가능한 각 이벤트에 대한 행을 반환합니다. LIKE
절을 편집하여 다른 이벤트 이름을 검색할 수 있습니다. 결과 집합은 이벤트를 포함하는 패키지도 식별합니다.
SELECT -- Find an event you want.
p.name AS [Package-Name],
o.object_type,
o.name AS [Object-Name],
o.description AS [Object-Descr],
p.guid AS [Package-Guid]
FROM sys.dm_xe_packages AS p
INNER JOIN sys.dm_xe_objects AS o
ON p.guid = o.package_guid
WHERE o.object_type = 'event' --'action' --'target'
AND p.name LIKE '%'
AND o.name LIKE '%sql%'
ORDER BY p.name,
o.object_type,
o.name;
다음 결과 예제에서는 반환된 행을 보여주며, 여기서는 column name = value
형식으로 피벗됩니다. 데이터는 이전 예제 단계에서 사용된 sql_statement_completed
이벤트의 데이터입니다. 개체에 대한 설명(이 예제의 경우 이벤트)은 설명서 문자열로 사용됩니다.
Package-Name = sqlserver
object_type = event
Object-Name = sql_statement_completed
Object-Descr = Occurs when a Transact-SQL statement has completed.
Package-Guid = 655FD93F-3364-40D5-B2BA-330F7FFB6491
SSMS UI를 사용하여 이벤트 찾기
이름으로 이벤트를 찾는 또 다른 옵션은 이전 스크린샷에 표시된 새 세션 > 이벤트 > 이벤트 라이브러리 대화 상자를 사용하는 것입니다. 부분 이벤트 이름을 입력하여 일치하는 모든 이벤트 이름을 찾을 수 있습니다.
SQL Trace 이벤트 클래스
SQL Trace 이벤트 클래스 및 열과 함께 확장 이벤트를 사용하는 방법에 대한 설명은 SQL Trace 이벤트 클래스에 해당하는 확장 이벤트 보기에서 확인할 수 있습니다.
ETW(Windows용 이벤트 추적)
ETW(Windows용 이벤트 추적)에서 확장 이벤트 사용에 대한 설명은 다음 문서를 참조하세요.
시스템 이벤트 세션
SQL Server 및 Azure SQL Managed Instance에서 여러 시스템 이벤트 세션이 기본적으로 만들어지며 데이터베이스 엔진이 시작될 때 시작되도록 구성됩니다. 대부분의 이벤트 세션과 마찬가지로 이러한 세션은 소량의 리소스를 사용하며 워크로드 성능에 실질적으로 영향을 주지 않습니다. Microsoft는 이러한 세션을 활성화 및 실행 상태로 유지하도록 권장합니다. 상태 세션, 특히 system_health 세션은 모니터링 및 문제 해결에 유용한 경우가 많습니다.
관리 > 확장 이벤트 > 세션 아래의 SSMS 개체 탐색기에서 이러한 이벤트 세션을 볼 수 있습니다. 예를 들어 SQL Server에서 이러한 시스템 이벤트 세션은 다음과 같습니다.
AlwaysOn_health
system_health
telemetry_events
PowerShell 공급자
SQL Server PowerShell 공급자를 사용하여 확장 이벤트를 관리할 수 있습니다. 자세한 내용은 확장 이벤트에 PowerShell 공급자 사용을 참조하세요.
시스템 보기
확장 이벤트에 대한 시스템 보기는 다음과 같습니다.
- 카탈로그 뷰:
CREATE EVENT SESSION
에 의해 정의된 이벤트 세션에 대한 정보입니다. - DMV(동적 관리 뷰): 현재 활성 상태인(시작된) 이벤트 세션에 대한 정보입니다.
SQL Server 확장 이벤트에 대한 시스템 뷰의 SELECT 및 JOIN은 다음에 대한 정보를 제공합니다.
- 뷰를 조인하는 방법
- 이러한 뷰를 기반으로 하는 몇 가지 유용한 쿼리
- 다음 사이의 상관 관계:
- 열 보기
CREATE EVENT SESSION
절- SSMS UI
부록: 확장 이벤트 권한 소유자를 찾는 쿼리
이 문서에 언급된 사용 권한은 다음과 같습니다.
ALTER ANY EVENT SESSION
VIEW SERVER STATE
CONTROL SERVER
다음 SELECT...UNION ALL
문은 이벤트 세션을 만들고 확장 이벤트에 대한 시스템 카탈로그 뷰를 쿼리하는 데 필요한 권한이 있는 사용자를 보여 주는 행을 반환합니다.
-- Ascertain who has the permissions listed in the ON clause.
-- 'CONTROL SERVER' permission includes the permissions
-- 'ALTER ANY EVENT SESSION' and 'VIEW SERVER STATE'.
SELECT 'Owner-is-Principal' AS [Type-That-Owns-Permission],
NULL AS [Role-Name],
prin.name AS [Owner-Name],
PERM.permission_name COLLATE Latin1_General_CI_AS_KS_WS AS [Permission-Name]
FROM sys.server_permissions AS PERM
INNER JOIN sys.server_principals AS prin
ON prin.principal_id = PERM.grantee_principal_id
WHERE PERM.permission_name IN (
'ALTER ANY EVENT SESSION',
'VIEW SERVER STATE',
'CONTROL SERVER'
)
UNION ALL
-- Plus check for members of the 'sysadmin' fixed server role,
-- because 'sysadmin' includes the 'CONTROL SERVER' permission.
SELECT 'Owner-is-Role',
prin.name, -- [Role-Name]
CAST((IsNull(pri2.name, N'No members')) AS NVARCHAR(128)),
NULL
FROM sys.server_role_members AS rolm
RIGHT JOIN sys.server_principals AS prin
ON prin.principal_id = rolm.role_principal_id
LEFT JOIN sys.server_principals AS pri2
ON rolm.member_principal_id = pri2.principal_id
WHERE prin.name = 'sysadmin';
HAS_PERMS_BY_NAME 함수
다음 SELECT
문은 사용 권한을 보고합니다. 기본 제공 함수 HAS_PERMS_BY_NAME을 사용합니다.
또한 다른 로그인을 일시적으로 가장할 권한이 있는 경우 EXECUTE AS LOGIN 및 REVERT
문의 주석 처리를 제거하여 다른 로그인에 ALTER ANY EVENT SESSION
권한이 있는지 확인할 수 있습니다.
--EXECUTE AS LOGIN = 'LoginNameHere';
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'ALTER ANY EVENT SESSION');
--REVERT;