다음을 통해 공유


서버 이벤트용 WMI 공급자와 함께 WQL 사용

적용 대상: SQL Server

관리 애플리케이션은 WQL(WMI 쿼리 언어) 문을 실행하여 서버 이벤트용 WMI 공급자를 사용하여 SQL Server 이벤트에 액세스합니다. WQL은 일부 WMI별 확장이 있는 SQL(구조적 쿼리 언어)의 간소화된 하위 집합입니다. WQL을 사용하면 애플리케이션이 SQL Server, 데이터베이스 또는 데이터베이스 개체의 특정 인스턴스에 대해 이벤트 형식을 검색합니다(현재 지원되는 유일한 개체는 큐임). 서버 이벤트용 WMI 공급자는 쿼리를 데이터베이스 범위 또는 개체 범위 이벤트 알림의 대상 데이터베이스 또는 서버 범위 이벤트 알림용 데이터베이스에서 master 만든 이벤트 알림으로 변환합니다.

예를 들어 다음 WQL 쿼리를 고려합니다.

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2022'

이 쿼리에서 WMI 공급자는 대상 서버에서 이 이벤트 알림과 동등한 값을 생성하려고 시도합니다.

USE AdventureWorks2022;
GO

CREATE EVENT NOTIFICATION SQLWEP_76CF38C1_18BB_42DD_A7DC_C8820155B0E9
    ON DATABASE
    WITH FAN_IN
    FOR DDL_DATABASE_LEVEL_EVENTS
    TO SERVICE
        'SQL/Notifications/ProcessWMIEventProviderNotification/v1.0',
        'A7E5521A-1CA6-4741-865D-826F804E5135';
GO

WQL 쿼리(FROM)의 DDL_DATABASE_LEVEL_EVENTS 절에 있는 인수는 이벤트 알림을 만들 수 있는 유효한 모든 이벤트일 수 있습니다. 및 WHERE 절의 SELECT 인수는 이벤트 또는 해당 부모 이벤트와 연결된 이벤트 속성을 지정할 수 있습니다. 유효한 이벤트 및 이벤트 속성 목록은 이벤트 알림(데이터베이스 엔진)을 참조하세요.

다음 WQL 구문은 서버 이벤트용 WMI 공급자에서 명시적으로 지원됩니다. 추가 WQL 구문을 지정할 수 있지만 이 공급자와는 관련이 없으며 WMI 호스트 서비스에서 대신 구문 분석합니다. WMI 쿼리 언어에 대한 자세한 내용은 MSDN(Microsoft Developer Network)의 WQL 설명서를 참조하세요.

구문

SELECT { event_property [ , ...n ] | * }
FROM event_type
WHERE where_condition
[ ; ]

인수

event_property [ , ... n ] | *

이벤트의 속성입니다. 이러한 예로 PostTime, SPIDLoginName이 있습니다. WMI Provider for Server 이벤트 클래스 및 속성나열된 각 이벤트를 조회하여 보유하는 속성을 확인합니다. 예를 들어 DDL_DATABASE_LEVEL_EVENTS 이벤트는 및 UserName 속성을 보유합니다DatabaseName. 또한 부모 이벤트에서 , LoginName, PostTimeSPIDComputerName 속성을 상속SQLInstance합니다.

  • , ... n

    event_property 쉼표로 구분하여 여러 번 쿼리할 수 있음을 나타냅니다.

  • *

    이벤트와 연결된 모든 속성이 쿼리되도록 지정합니다.

event_type

이벤트 알림을 만들 수 있는 모든 이벤트입니다. 사용 가능한 이벤트 목록은 WMI Provider for Server Events 클래스 및 속성을 참조 하세요. 이벤트 유형 이름은 사용하여 이벤트 알림을 CREATE EVENT NOTIFICATION수동으로 만들 때 지정할 수 있는 동일한 | event_type event_group 해당합니다. 이벤트 형식예로는 CREATE_TABLE, LOCK_DEADLOCK, DDL_USER_EVENTSTRC_DATABASE.

참고 항목

DDL과 유사한 작업을 수행하는 특정 시스템 저장 프로시저도 이벤트 알림을 실행할 수 있습니다. 이벤트 알림을 테스트하여 실행되는 시스템 저장 프로시저에 대한 응답을 확인합니다. 예를 들어 CREATE TYPE 문과 sp_addtype 저장 프로시저는 모두 이벤트에 생성 CREATE_TYPE 되는 이벤트 알림을 실행합니다. 그러나 저장 프로시저는 sp_rename 이벤트 알림을 발생하지 않습니다. 자세한 내용은 DDL 이벤트를 참조 하세요.

where_condition

WHERE event_property 이름과 논리 및 비교 연산자로 구성된 절 쿼리 조건자입니다. where_condition 대상 데이터베이스에 해당 이벤트 알림이 등록되는 범위를 결정합니다. event_type 쿼리 할 특정 스키마 또는 개체를 대상으로 지정하는 필터 역할을 할 수도 있습니다. 자세한 내용은 설명 섹션을 참조하세요 .

피연산자 = 만 , SchemaNameObjectName.와 함께 DatabaseName사용할 수 있습니다. 이러한 이벤트 속성에는 다른 식을 사용할 수 없습니다.

설명

서버 이벤트용 WMI 공급자 구문의 where_condition 다음을 결정합니다.

  • 공급자가 지정된 event_type 검색하려고 하는 범위입니다. 서버 수준, 데이터베이스 수준 또는 개체 수준(현재 지원되는 개체는 큐뿐임). 궁극적으로 이 범위는 대상 데이터베이스에서 만든 이벤트 알림 유형을 결정합니다. 이 프로세스는 이벤트 알림 등록이라고 합니다.

  • 등록할 데이터베이스, 스키마 및 개체(해당하는 경우)입니다.

서버 이벤트용 WMI 공급자는 상향식 첫 번째 맞춤 알고리즘을 사용하여 기본 이벤트에 대해 가능한 가장 좁은 범위를 생성합니다 EVENT NOTIFICATION. 이 알고리즘은 SQL Server 인스턴스와 WMI 호스트 프로세스 간의 서버 및 네트워크 트래픽에 대한 내부 작업을 최소화하려고 합니다. 공급자는 절에 FROM 지정된 event_type 및 절의 WHERE 조건을 검사하고 가능한 가장 좁은 범위로 기본 EVENT NOTIFICATION 을 등록하려고 시도합니다. 공급자가 가장 좁은 범위에 등록할 수 없는 경우 등록이 마지막으로 성공할 때까지 연속적으로 더 높은 범위에서 등록을 시도합니다. 가장 높은 범위인 서버 수준에 도달했지만 실패하는 경우 소비자에게 오류를 반환합니다.

예를 들어 절에 WHERE 지정된 경우 DatabaseName='AdventureWorks2022' 공급자는 데이터베이스에 AdventureWorks2022 이벤트 알림을 등록하려고 합니다. AdventureWorks2022 데이터베이스가 있고 AdventureWorks2022에 이벤트 알림을 만드는 데 필요한 권한이 호출 클라이언트에 있으면 등록이 성공합니다. 그렇지 않으면 서버 수준에서 이벤트 알림을 등록하려고 시도합니다. WMI 클라이언트에 필요한 사용 권한이 있으면 등록이 성공합니다. 그러나 이 시나리오에서는 데이터베이스를 만들 때까지 이벤트가 클라이언트에 AdventureWorks2022 반환되지 않습니다.

또한 where_condition 필터 역할을 하여 쿼리를 특정 데이터베이스, 스키마 또는 개체로 제한할 수도 있습니다. 예를 들어 다음 WQL 쿼리를 고려합니다.

SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks2022' AND SchemaName = 'Sales'
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'

등록 프로세스의 결과에 따라 이 WQL 쿼리는 데이터베이스 또는 서버 수준에서 등록될 수 있습니다. 그러나 서버 수준에서 등록되어 있더라도 공급자는 궁극적으로 테이블에 적용되지 Sales.SalesOrderDetail 않는 이벤트를 ALTER_TABLE 필터링합니다. 즉, 공급자는 해당 특정 테이블에서 발생하는 이벤트의 속성 ALTER_TABLE 만 반환합니다.

같은 DatabaseName='AW1' OR DatabaseName='AW2' 복합 식을 지정 하는 경우 두 개의 별도 이벤트 알림 대신 서버 범위에서 단일 이벤트 알림을 등록 하려고 합니다. 호출 클라이언트에 사용 권한이 있으면 등록이 성공합니다.

절에 WHERE 모두 지정된 경우 SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' 스키마X의 개체 Z 에 직접 이벤트 알림을 등록하려고 합니다. 클라이언트에 권한이 있는 경우 등록에 성공합니다. 현재 개체 수준 이벤트는 큐에서만 지원되며 event_type 대해서만 QUEUE_ACTIVATION 지원됩니다.

특정 범위에서 모든 이벤트를 쿼리할 수 있는 것은 아닙니다. 예를 들어 Lock_Deadlock 같은 추적 이벤트에 대한 WQL 쿼리 또는 다음과 같은 TRC_LOCKS추적 이벤트 그룹은 서버 수준에서만 등록할 수 있습니다. 마찬가지로 이벤트 CREATE_ENDPOINTDDL_ENDPOINT_EVENTS 이벤트 그룹은 서버 수준에서만 등록할 수 있습니다. 이벤트를 등록하기 위한 적절한 범위에 대한 자세한 내용은 이벤트 알림 디자인을 참조 하세요. 서버 수준에서만 event_type 등록할 수 있는 WQL 쿼리를 등록하려는 시도는 항상 서버 수준에서 이루어집니다. WMI 클라이언트에 권한이 있으면 등록에 성공합니다. 그렇지 않으면 오류가 클라이언트에 반환됩니다. 그러나 경우에 따라 해당 이벤트에 해당하는 속성을 기반으로 서버 수준 이벤트에 대한 필터로 절을 계속 사용할 WHERE 수 있습니다. 예를 들어 많은 추적 이벤트에는 DatabaseName 절에서 필터로 사용할 수 있는 속성이 WHERE 있습니다.

서버 범위 이벤트 알림은 데이터베이스에 master 생성되며 sys.server_event_notifications 카탈로그 뷰를 사용하여 메타데이터에 대해 쿼리할 수 있습니다.

데이터베이스 범위 또는 개체 범위 이벤트 알림은 지정된 데이터베이스에서 생성되며 sys.event_notifications 카탈로그 뷰를 사용하여 메타데이터에 대해 쿼리할 수 있습니다. 카탈로그 뷰에 해당 데이터베이스 이름을 접두사로 추가해야 합니다.

예제

이 문서의 Transact-SQL 코드 샘플은 AdventureWorks2022 또는 AdventureWorksDW2022 샘플 데이터베이스를 사용하며, 이는 Microsoft SQL Server 예시 및 커뮤니티 프로젝트(Microsoft SQL Server Samples and Community Projects) 홈 페이지에서 다운로드할 수 있습니다.

A. 서버 범위에서 이벤트 쿼리

다음 WQL 쿼리는 SQL Server 인스턴스에서 발생하는 모든 SERVER_MEMORY_CHANGE 추적 이벤트에 대한 모든 이벤트 속성을 검색합니다.

SELECT * FROM SERVER_MEMORY_CHANGE

B. 데이터베이스 범위에서 이벤트 쿼리

다음 WQL 쿼리는 데이터베이스에서 AdventureWorks2022 발생하고 이벤트 그룹 아래에 DDL_DATABASE_LEVEL_EVENTS 있는 모든 이벤트에 대한 특정 이벤트 속성을 검색합니다.

SELECT SPID, SQLInstance, DatabaseName FROM DDL_DATABASE_LEVEL_EVENTS
WHERE DatabaseName = 'AdventureWorks2022'

C. 데이터베이스 범위에서 이벤트 쿼리, 스키마 및 개체별 필터링

다음 쿼리는 테이블에서 Sales.SalesOrderDetail발생하는 모든 ALTER_TABLE 이벤트에 대한 모든 이벤트 속성을 검색합니다.

SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks2022' AND SchemaName = 'Sales'
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'