서버 이벤트용 WMI 공급자에 WQL 사용

관리 응용 프로그램은 서버 이벤트용 WMI 공급자를 통해 WQL(WMI Query Language) 문을 실행하여 SQL Server 이벤트에 액세스합니다. WQL은 몇 가지 WMI 관련 확장 기능이 포함된 SQL(구조적 쿼리 언어)의 단순화된 일부입니다. WQL을 사용할 경우 응용 프로그램은 특정 SQL Server 인스턴스, 데이터베이스 또는 데이터베이스 개체(현재 지원되는 유일한 개체는 큐임)에 대해 이벤트 유형을 검색합니다. 서버 이벤트용 WMI 공급자는 데이터베이스 범위 또는 개체 범위 이벤트 알림의 대상 데이터베이스나 서버 범위 이벤트 알림의 master 데이터베이스에 생성되는 이벤트 알림으로 쿼리를 변환합니다.

예를 들어 다음 WQL 쿼리를 살펴보십시오.

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2008R2'

이 쿼리에서 WMI 공급자는 대상 서버에서 이벤트 알림과 동등한 항목을 생성합니다.

USE AdventureWorks2008R2 ;
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 쿼리(DDL_DATABASE_LEVEL_EVENTS)의 FROM 절에 있는 인수는 이벤트 알림을 만들 수 있는 유효한 모든 이벤트일 수 있습니다. SELECT 및 WHERE 절의 인수는 이벤트 또는 해당 부모 이벤트와 연결된 이벤트 속성을 지정할 수 있습니다. 유효한 이벤트 및 이벤트 속성 목록을 보려면 서버 이벤트용 WMI 공급자 클래스 및 속성을 참조하십시오.

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

구문

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

인수

  • event_property
    이벤트의 속성입니다. 이러한 예로 PostTime, SPID 및 LoginName이 있습니다. 서버 이벤트용 WMI 공급자 클래스 및 속성에 표시된 각 이벤트를 조회하여 포함된 속성을 확인합니다. 예를 들어 DDL_DATABASE_LEVEL_EVENTS 이벤트는 DatabaseName 및 UserName 속성을 포함합니다. 또한 부모 이벤트에서 SQLInstance, LoginName, PostTime, SPID 및 ComputerName 속성을 상속합니다.

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

  • *
    이벤트와 관련된 모든 속성이 쿼리되도록 지정합니다.

  • event_type
    이벤트 알림을 만들 수 있는 모든 이벤트입니다. 사용 가능한 이벤트 목록을 보려면 서버 이벤트용 WMI 공급자 클래스 및 속성을 참조하십시오. event type 이름은 CREATE EVENT NOTIFICATION을 사용하여 수동으로 이벤트 알림을 만들 때 지정할 수 있는 동일한 event_type | event_group과 일치합니다. event type의 예로 CREATE_TABLE, LOCK_DEADLOCK, DDL_USER_EVENTS 및 TRC_DATABASE가 있습니다.

    [!참고]

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

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

    = 피연산자만 DatabaseName, SchemaName 및 ObjectName과 함께 사용할 수 있습니다. 다른 식은 이러한 이벤트 속성과 함께 사용할 수 없습니다.

주의

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

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

  • 필요한 경우 등록이 수행되는 데이터베이스, 스키마 및 개체입니다.

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

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

where_condition은 특정 데이터베이스, 스키마 또는 개체에 대한 쿼리를 추가로 제한하는 필터 역할도 합니다. 예를 들어 다음 WQL 쿼리를 살펴보십시오.

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

등록 프로세스의 결과에 따라 이 WOL 쿼리를 데이터베이스 또는 서버 수준에서 등록할 수 있습니다. 하지만 서버 수준에서 등록된 경우에도 공급자는 궁극적으로 AdventureWorks2008R2.Sales.SalesOrderDetail 테이블에 적용되지 않는 모든 ALTER_TABLE 이벤트를 필터링합니다. 즉, 공급자는 특정 테이블에서 발생하는 ALTER_TABLE 이벤트의 속성만 반환합니다.

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

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

임의의 특정 범위에서 모든 이벤트를 쿼리할 수는 없습니다. 예를 들어 Lock_Deadlock과 같은 추적 이벤트나 TRC_LOCKS와 같은 추적 이벤트 그룹의 WQL 쿼리는 서버 수준에서만 등록할 수 있습니다. 이와 유사하게, CREATE_ENDPOINT 이벤트 및 DDL_ENDPOINT_EVENTS 이벤트 그룹도 서버 수준에서만 등록할 수 있습니다. 이벤트 등록에 적합한 범위에 대한 자세한 내용은 이벤트 알림 디자인을 참조하십시오. 서버 수준에서만 event_type을 등록할 수 있는 WQL 쿼리 등록은 항상 서버 수준에서 시도됩니다. WMI 클라이언트에 사용 권한이 있으면 등록이 성공합니다. 그렇지 않으면 오류가 클라이언트에 반환됩니다. 하지만 경우에 따라 이벤트에 해당하는 속성을 기반으로 WHERE 절을 서버 수준 이벤트의 필터로 사용할 수 있습니다. 예를 들어 많은 추적 이벤트에는 WHERE 절에 필터로 사용할 수 있는 DatabaseName 속성이 있습니다.

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

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

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

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

SELECT * FROM SERVER_MEMORY_CHANGE

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

다음 WQL 쿼리는 AdventureWorks2008R2 데이터베이스에서 발생하고 DDL_DATABASE_LEVEL_EVENTS 이벤트 그룹에 속한 이벤트의 특정 이벤트 속성을 검색합니다.

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

3. 스키마 및 개체로 필터링하여 데이터베이스 범위에서 이벤트 쿼리

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

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