빠른 시작: 확장 이벤트

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

확장 이벤트는 사용자가 데이터를 수집하여 문제를 모니터링하고 해결할 수 있는 간단한 성능 모니터링 기능입니다. 확장 이벤트를 사용하면 성능 모니터링 및 문제 해결 목적과 관련된 데이터베이스 엔진 내부 작업에 대한 세부 정보를 볼 수 있습니다. 확장 이벤트에 대한 자세한 내용은 확장 이벤트 개요를 참조하세요.

이 문서는 확장 이벤트를 신규로 사용하고 몇 분 만에 이벤트 데이터를 보려는 SQL 관리자, 엔지니어 및 개발자를 돕는 것을 목표로 합니다.

확장 이벤트를 XEvents라고도 하며 때로는 XE일 수도 있습니다.

이 문서를 읽은 후 다음을 수행할 수 있습니다.

  • 예제 스크린샷을 사용하여 SSMS(SQL Server Management Studio)에서 이벤트 세션을 만드는 방법을 알아보세요.
  • 스크린샷을 동등한 Transact-SQL 문과 상호 연결
  • SSMS 사용자 인터페이스 및 XEvents T-SQL 문 뒤에 있는 용어 및 개념을 자세히 이해합니다.
  • 이벤트 세션을 테스트하는 방법 알아보기
  • 다음을 포함하여 세션 결과를 이해합니다.
    • 결과 스토리지에 사용 가능한 옵션
    • 처리된 결과와 원시 결과 비교
    • 다양한 방법과 다양한 시간 눈금으로 결과를 보기 위한 도구
  • 사용 가능한 모든 이벤트를 검색하고 검색하는 방법을 알아보세요.
  • 확장 이벤트 시스템 뷰 간의 관계 이해

코드 샘플을 포함하여 Azure SQL Database의 확장 이벤트에 대한 자세한 내용은 SQL Database의 확장 이벤트를 참조하세요.

초기 필수 구성 요소

시작하려면 다음을 수행해야 합니다.

  1. SSMS(SQL Server Management Studio) 다운로드합니다. 최신 버전의 SSMS를 최신 개선 및 수정과 함께 사용하는 것이 좋습니다.
  2. 계정에 ALTER ANY EVENT SESSION서버 권한이 있는지 확인합니다.

확장 이벤트와 관련된 보안 및 권한에 대한 자세한 내용은 부록에서 이 문서의 끝부분에 있습니다.

SSMS의 확장 이벤트

SSMS는 확장 이벤트에 대한 완벽하게 작동하는 UI(사용자 인터페이스)를 제공합니다. T-SQL 또는 DMV(동적 관리 뷰)를 사용하지 않고도 이 UI를 사용하여 많은 시나리오를 수행할 수 있습니다.

이 섹션에서는 확장 이벤트 세션을 만들고 보고하는 데이터를 확인하는 UI 단계를 볼 수 있습니다. 이 문서에서 단계 실습을 진행하거나 검토한 후에는 단계와 관련된 개념에 대해 자세히 이해할 수 있습니다.

SSMS에서 이벤트 세션 만들기

확장 이벤트 세션을 만들 때 시스템에 다음을 알릴 수 있습니다.

  • 관심 있는 이벤트
  • 시스템에서 사용자에게 데이터를 보고하는 방법

데모에서는 새 세션 대화 상자가 열리고, 다음과 같은 네 개의 페이지를 사용하는 방법을 보여 줍니다.

  • 일반
  • 이벤트
  • 데이터 스토리지
  • 고급

텍스트 및 지원 스크린샷은 SSMS 버전에서 약간 다를 수 있지만 여전히 기본 개념에 대한 설명과 관련이 있어야 합니다.

  1. 데이터베이스 엔진 인스턴스에 커넥트. 확장 이벤트는 AZURE SQL Database 및 Azure SQL Managed Instance에서 SQL Server 2014부터 지원됩니다.

  2. 개체 탐색기 확장 이벤트 관리를 > 선택합니다. Azure SQL Database에서 이벤트 세션은 데이터베이스 범위이므로 확장 이벤트 옵션은 관리가 아닌 각 데이터베이스에서 찾을 수 있습니다. 세션 폴더를 마우스 오른쪽 단추로 클릭하고 새 세션을 선택합니다. 새 세션 대화 상자는 새 세션 마법사보다 낫지만 두 대화 상자는 비슷합니다.

  3. 왼쪽 위에서 일반 페이지를 선택합니다. 그런 다음 세션 이름 텍스트 상자에 원하는 이름을 입력YourSession합니다. 다른 페이지에 일부 세부 정보를 입력해야 하므로 아직 확인을 선택하지 마세요.

    Screenshot of New Session > General > Session name.

  4. 왼쪽 위에서 이벤트 페이지를 선택합니다.

    Screenshot of New Session > Events > Select > Event library, Selected events.

  5. 이벤트 라이브러리 영역의 드롭다운 목록에서 이벤트 이름만 선택합니다.

    • 텍스트 상자에 입력 sql_statement_ 합니다. 이렇게 하면 이름이 있는 이벤트 sql_statement_ 만 표시하도록 목록을 필터링합니다.
    • 스크롤하여 이름이 인 sql_statement_completed이벤트를 선택합니다.
    • 오른쪽 화살표 단추를 > 선택하여 이벤트를 선택한 이벤트 상자로 이동합니다.
  6. 이벤트 페이지에서 오른쪽 위에 있는 구성 단추를 선택합니다. 그러면 선택한 이벤트에 대한 이벤트 구성 옵션 상자가 열립니다.

    Screenshot of New Session > Events > Configure > Filter (Predicate) > Field.

  7. 필터(조건자) 탭을 선택합니다. 다음으로, 절을 추가하려면 여기를 선택합니다. 절이 있는 모든 SELECT 문을 캡처하도록 이 필터(조건자라고도 함)를 구성합니다 HAVING .

  8. 필드 드롭다운 목록에서 .를 선택합니다sqlserver.sql_text.

    • 연산자에 대해 을 선택합니다like_i_sql_unicode_string. i 여기서 연산자의 이름으로 case-i nsensitive를 의미합니다.
    • 값의 경우 .를 입력합니다%SELECT%HAVING%. 여기서 백분율 기호는 모든 문자열에 대해 야생카드입니다.

    참고 항목

    필드 의 두 부분으로 구성된 이름에서 sqlserver 는 패키지 이름이고 sql_text 필드 이름입니다. 이전에 선택한 sql_statement_completed 이벤트는 선택한 필드와 같은 패키지에 있어야 합니다.

  9. 왼쪽 위에서 데이터 스토리지 페이지를 선택합니다.

  10. 대상 영역에서 대상을 추가하려면 여기를 선택합니다.

    • 형식 드롭다운 목록에서 .를 선택합니다event_file. 즉, 이벤트 데이터는 나중에 열고 볼 수 있는 파일에 저장됩니다. Azure SQL Database 및 Azure SQL Managed Instance에서 이벤트 데이터는 Azure Storage Blob에 저장됩니다.

    참고 항목

    SQL Server 2019부터 SQL Server의 대상에서 Azure Blob Storage를 event_file 사용할 수 있습니다.

    Screenshot of New Session > Data Storage > Targets > Type > event_file.

  11. 속성 영역에서 전체 경로 및 파일 이름을 서버 텍스트 상자의 파일 이름에 입력합니다. 찾아보기 단추를 사용할 수도 있습니다. 파일 이름 확장명은 .이어야 xel합니다. 이 예제에서는 사용했습니다. C:\Temp\YourSession_Target.xel

    Screenshot of New Session > Advanced > Maximum dispatch latency > OK.

  12. 왼쪽 위에서 고급 페이지를 선택합니다. 최대 디스패치 대기 시간을 3초로 줄입니다.

  13. 아래쪽에서 확인 단추를 선택하여 이 이벤트 세션을 만듭니다.

  14. 개체 탐색기 돌아가서 Sessions 폴더를 열거나 새로 고치고 새 노드를 YourSession참조하세요. 세션이 아직 시작되지 않았습니다. 나중에 시작합니다.

    Screenshot of Node for your new *event session* named YourSession, in the Object Explorer, under Management > Extended Events > Sessions.

SSMS에서 이벤트 세션 편집

SSMS 개체 탐색기 해당 노드를 마우스 오른쪽 단추로 클릭한 다음 속성을 선택하여 이벤트 세션을 편집할 수 있습니다. 동일한 다중 페이지 대화 상자가 표시됩니다.

T-SQL을 사용하여 이벤트 세션 만들기

SSMS 확장 이벤트 UI에서 다음과 같이 T-SQL 스크립트를 생성하여 이벤트 세션을 만들 수 있습니다.

  • 이벤트 세션 노드를 마우스 오른쪽 단추로 클릭한 다음 스크립트 세션을 CREATE로 클립보드로 >> 선택합니다.
  • 텍스트 편집기에 붙여넣습니다.

다음에 대해 생성된 CREATE EVENT SESSION T-SQL 문은 다음과 같습니다.YourSession

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 SESSIONDROP 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;

데이터베이스 엔진 인스턴스가 시작될 때 자동으로 시작되도록 이벤트 세션을 구성하는 옵션이 있습니다. 의 STARTUP STATE = ON 키워드(keyword) 참조하세요CREATE EVENT SESSION.

SSMS UI는 새 세션 > 일반 페이지에서 서버 시작 시 이벤트 세션을 시작하는 해당 검사box제공합니다.

이벤트 세션 테스트

다음 단계를 사용하여 이벤트 세션을 테스트합니다.

  1. 개체 탐색기 이벤트 세션 노드를 마우스 오른쪽 단추로 클릭한 다음 세션 시작을 선택합니다.
  2. 이벤트 세션을 만든 동일한 서버(또는 Azure SQL Database의 동일한 데이터베이스)에 연결된 동안 다음 SELECT...HAVING 문을 두 번 실행합니다. 각 실행에 대한 절의 HAVING 값을 변경하여 2에서 3 사이로 전환하는 것이 좋습니다. 이렇게 하면 결과의 차이를 볼 수 있습니다.
  3. 세션 노드를 마우스 오른쪽 단추로 클릭하고 세션 중지를 선택합니다.
  4. SELECT 및 결과를 보는 방법에 대한 다음 하위 섹션을 읽어봅니다.
SELECT
        c.name,
        Count(*)  AS [Count-Per-Column-Repeated-Name]
    FROM
             sys.syscolumns  AS c
        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 선택합니다.

  • 열의 셀에서 XML 문자열을 복사합니다 event_data . 메모장 같은 텍스트 편집기에 붙여넣고 파일을 확장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
        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(*) &gt;= 3   --2     -- Try both values during session.
    ORDER BY
        c.name</value>
  </data>
</event>

SSMS에 이벤트 세션 데이터 표시

SSMS UI에는 이벤트 세션에서 캡처한 데이터를 보는 데 사용할 수 있는 몇 가지 고급 기능이 있습니다. 자세한 내용은 SQL Server Management Studio에서 이벤트 데이터 보기를 참조 하세요.

대상 데이터 보기 및 조사식 라이브 데이터 레이블이 지정된 상황에 맞는 메뉴 옵션으로 시작합니다.

대상 데이터 보기

SSMS 개체 탐색기 이벤트 세션 노드 아래에 있는 대상 노드를 마우스 오른쪽 단추로 클릭할 수 있습니다. 상황에 맞는 메뉴에서 대상 데이터 보기를 선택합니다. SSMS는 데이터를 표시합니다.

세션에서 새 이벤트가 발생하면 디스플레이가 업데이트되지 않습니다. 하지만 대상 데이터 보기를 다시 선택할 수 있습니다.

Screenshot of View Target Data, in SSMS, Management > Extended Events > Sessions > YourSession > package0.event_file, right-click.

라이브 데이터 보기

SSMS 개체 탐색기에서 이벤트 세션 노드를 마우스 오른쪽 단추로 클릭할 수 있습니다. 상황에 맞는 메뉴에서 라이브 데이터 감시를 선택합니다. SSMS는 실시간으로 계속 도착할 때 들어오는 데이터를 표시합니다.

Screenshot of Watch Live Data, in SSMS, Management > Extended Events > Sessions > YourSession, right-click.

확장 이벤트의 사용 약관 및 개념

다음 표에서는 확장 이벤트에 사용되는 용어를 나열하고 해당 의미를 설명합니다.

용어 설명
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 문에는 이벤트와 completed 이벤트가 있습니다started.

이벤트에 적합한 필드는 이벤트가 있는 패키지에도 있습니다. 대부분의 대상은 package0 다른 많은 패키지의 이벤트에 있으며 사용됩니다.

확장 이벤트 시나리오 및 사용량 세부 정보

확장 이벤트를 사용하여 데이터베이스 엔진 및 쿼리 워크로드를 모니터링하고 문제를 해결하는 다양한 시나리오가 있습니다. 다음 문서에서는 잠금 관련 시나리오를 사용하는 예제를 제공합니다.

패키지에서 사용할 수 있는 이벤트를 검색하는 방법

다음 쿼리는 이름에 세 개의 문자열 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 추적 이벤트 클래스 및 열과 함께 확장 이벤트를 사용하는 방법에 대한 설명은 SQL 추적 이벤트 클래스에 해당하는 확장 이벤트 보기에서 확인할 수 있습니다.

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 의 확장 이벤트에 대한 시스템 뷰의 SELEC 및 JOIN은 다음에 대한 정보를 제공합니다.

  • 뷰를 조인하는 방법
  • 이러한 뷰를 기반으로 하는 몇 가지 유용한 쿼리
  • 다음 사이의 상관 관계:
    • 열 보기
    • CREATE EVENT SESSION
    • The 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 LOGINREVERT 문의 주석 처리를 제거하여 다른 로그인에 사용 권한이 있는지 ALTER ANY EVENT SESSION 확인할 수 있습니다.

--EXECUTE AS LOGIN = 'LoginNameHere';
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'ALTER ANY EVENT SESSION');
--REVERT;