서버 이벤트용 WMI 공급자 작업

적용 대상:SQL Server

이 문서에서는 WMI Provider for Server Events를 사용하여 프로그래밍하기 전에 고려해야 할 지침을 제공합니다.

Service Broker 사용

서버 이벤트용 WMI 공급자는 이벤트에 대한 WQL 쿼리를 대상으로 하는 데이터베이스의 이벤트 알림으로 변환하여 작동합니다. 이벤트 알림이 작동하는 방식을 이해하는 것은 공급자에 대해 프로그래밍할 때 유용할 수 있습니다. 자세한 내용은 서버 이벤트용 WMI 공급자 개념을 참조 하세요.

특히 WMI 공급자가 만든 이벤트 알림은 SQL Server를 사용하여 서버 이벤트에 대한 메시지를 보내기 때문에 이벤트가 생성되는 모든 위치에서 이 서비스를 사용하도록 설정해야 합니다. 프로그램이 서버 인스턴스에서 이벤트를 쿼리하는 경우 공급자가 msdb 만든 대상 Service Broker 서비스(SQL/Notifications/ProcessWMIEventProviderNotification/v1.0)의 위치이므로 해당 인스턴스의 Service Broker를 사용하도록 설정해야 합니다. 프로그램에서 데이터베이스 또는 특정 데이터베이스 개체의 이벤트를 쿼리하는 경우 해당 대상 데이터베이스의 Service Broker를 사용하도록 설정해야 합니다. 애플리케이션을 배포한 후 해당 Service Broker를 사용하도록 설정하지 않으면 기본 이벤트 알림에서 생성된 모든 이벤트가 이벤트 알림에서 사용하는 서비스의 큐로 전송되지만 Service Broker를 사용하도록 설정할 때까지 WMI 관리 애플리케이션으로 반환되지 않습니다.

다음 쿼리는 서버 인스턴스에서 사용하도록 설정된 서비스 브로커와 broker 인스턴스 GUID를 결정합니다.

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases;

서비스 브로커 GUID msdb 는 공급자의 대상 서비스의 위치이므로 특히 중요합니다.

데이터베이스에서 Service Broker를 사용하도록 설정하려면 ALTER DATABASE 문의 ENABLE_BROKER SET 옵션을 사용합니다.

연결 문자열 지정

애플리케이션은 공급자가 정의한 WMI 네임스페이스에 연결하여 서버 이벤트용 WMI 공급자를 SQL Server 인스턴스로 전달합니다. Windows WMI 서비스는 이 네임스페이스를 공급자 DLL, Sqlwep.dll에 매핑하고 메모리에 로드합니다. SQL Server의 각 인스턴스에는 고유한 WMI 네임스페이스가 있으며, 기본값은 \\.\root\Microsoft\SqlServer\ServerEvents\instance_name. instance_name 기본적으로 SQL Server를 설치할 때 MSSQLSERVER로 설정됩니다.

사용 권한 및 서버 인증

WMI Provider for Server Events에 액세스하려면 WMI 관리 애플리케이션이 시작되는 클라이언트가 애플리케이션의 연결 문자열 지정된 SQL Server 인스턴스의 Windows 인증 로그인 또는 그룹에 해당해야 합니다.

사용 권한 및 이벤트 알림 범위

서버 이벤트용 WMI 공급자는 WQL 쿼리를 대상 데이터베이스의 이벤트 알림으로 변환합니다. 이 때문에 호출 애플리케이션은 공급자에 액세스하는 데 필요한 최소 권한뿐만 아니라 데이터베이스에 필요한 이벤트 알림을 만들 수 있는 올바른 권한도 있어야 합니다. 사용 권한은 다음과 같습니다.

  • 데이터베이스로 범위가 지정된 이벤트 알림을 만들려면 최소한 현재 데이터베이스에서 CREATE DATABASE DDL EVENT NOTIFICATION 권한이 필요합니다.

  • 서버로 범위가 지정된 DDL 문에 이벤트 알림을 만들려면 최소한 서버의 CREATE DDL EVENT NOTIFICATION 권한이 필요합니다.

  • 추적 이벤트에 대한 이벤트 알림을 만들려면 최소한 서버에서 CREATE TRACE EVENT NOTIFICATION 권한이 필요합니다.

  • 범위가 큐에 한정되는 이벤트 알림을 생성하려면 최소한 해당 큐에 대해 ALTER 권한이 필요합니다.

WQL 쿼리의 범위를 지정하는 방법에 대한 자세한 내용은 서버 이벤트에 대한 WMI 공급자와 함께 WQL 사용을 참조 하세요.

예를 들어 다음과 같은 WQL 쿼리가 포함된 WMI 공급자 애플리케이션을 생각해 볼 수 있습니다.

SELECT * FROM ALTER_TABLE
WHERE DatabaseName = "AdventureWorks2022"
    AND SchemaName = "Person"
    AND ObjectName = "Person"
    AND ObjectType = "TABLE";

WMI 공급자는 이 쿼리를 데이터베이스에서 AdventureWorks2022 만든 이벤트 알림으로 변환합니다. 이는 호출자가 이러한 이벤트 알림을 생성하는 데 필요한 권한, 즉 AdventureWorks2022 데이터베이스에 대한 CREATE DATABASE DDL EVENT NOTIFICATION 권한을 가지고 있어야 함을 의미합니다.

WQL 쿼리가 서버 수준에서 범위가 지정된 이벤트 알림을 지정하는 경우(예: SELECT * FROM ALTER_TABLE 쿼리를 실행하여) 호출 애플리케이션에는 서버 수준 CREATE DDL EVENT NOTIFICATION 권한이 있어야 합니다. 서버 범위 이벤트 알림은 데이터베이스에 master 저장됩니다. sys.server_event_notifications 카탈로그 뷰를 사용하여 해당 메타데이터를 볼 수 있습니다.

참고 항목

WMI 공급자(서버, 데이터베이스 또는 개체)에서 만든 이벤트 알림의 범위는 궁극적으로 WMI 공급자가 사용하는 권한 확인 프로세스의 결과에 따라 달라집니다. 이는 공급자를 호출하는 사용자의 권한 집합 및 쿼리 중인 데이터베이스의 확인에 의해 영향을 받습니다.

이전 예제에서 공급자는 먼저 데이터베이스(ON DATABASE)로 범위가 지정된 이벤트 알림을 만들려고 합니다. 공급자가 데이터베이스가 있는지 확인하고 호출자에게 이벤트 알림을 만드는 데 필요한 권한이 있는지 확인하면 등록에 성공합니다. 성공하지 못한 경우 공급자는 서버(ON SERVER)에 이벤트 알림을 만들려고 합니다. 이 시도가 성공한다고 가정하면 서버에서 발생하는 모든 ALTER_TABLE 이벤트가 SQL Server 프로세스에서 WMI 서비스 프로세스로 전송됩니다. 그러나 공급자는 데이터베이스에 적용되지 AdventureWorks2022 않는 이벤트를 필터링합니다. 이 프로세스를 사용하면 이벤트의 범위에 필요한 것보다 네트워크 트래픽이 증가할 수 있지만 필요에 따라 데이터베이스가 생성되기 전에 데이터베이스에 WQL 쿼리를 등록한 다음 데이터베이스 생성 후 DDL 작업이 시작되기 전에 이벤트 데이터를 받을 수 있습니다.

사용 권한 및 메시지 확인

다음 조건이 모두 충족되면 WMI 공급자는 이벤트 알림에 대한 메시지를 보내지 않습니다.

  • WMI 공급자를 통해 이벤트 알림을 만든 사용자가 더 이상 데이터베이스에 없거나 유사한 이벤트 알림을 만드는 데 필요한 권한이 더 이상 없습니다.

  • 이벤트 알림은 다음 이벤트에 생성됩니다.

    • DROP_LOGIN

    • ALTER_LOGIN

    • DROP_USER

    • ALTER_USER

    • ADD_ROLE_MEMBER

    • DROP_ROLE_MEMBER

    • ADD_SERVER_ROLE_MEMBER

    • DROP_SERVER_ROLE_MEMBER

    • DENY또는 REVOKE (,, ALTER ANY DATABASE EVENT NOTIFICATION, CREATE DATABASE DDL EVENT NOTIFICATION, CREATE DDL EVENT NOTIFICATIONCONTROL SERVERALTER ANY EVENT NOTIFICATION또는 CREATE TRACE EVENT NOTIFICATION 사용 권한에만 ALTER DATABASE적용됩니다.)

클라이언트 쪽에서 이벤트 데이터 작업

서버 이벤트용 WMI 공급자가 대상 데이터베이스에 필요한 이벤트 알림을 만든 후 이벤트 알림은 SQL/Notifications/ProcessWMIEventProviderNotification/v1.0이라는 대상 서비스 msdb 로 이벤트 데이터를 보냅니다. 대상 서비스는 WMIEventProviderNotificationQueue라는 큐에 msdb 이벤트를 배치합니다. (서비스와 큐는 모두 SQL Server에 처음 연결할 때 공급자가 동적으로 만듭니다.) 그런 다음 공급자는 이 큐에서 XML 이벤트 데이터를 읽고 이를 MOF(관리형 개체 형식)로 변환한 후 클라이언트 애플리케이션으로 반환합니다. MOF 데이터는 WQL 쿼리에서 CIM(Common Information Model) 클래스 정의로 요청한 이벤트의 속성으로 구성됩니다. 각 속성에는 해당 CIM 유형이 있습니다. 예를 들어 SPID 속성은 CIM 형식 Sint32로 반환됩니다. 각 속성에 대한 CIM 형식은 WMI Provider for Server Events 클래스 및 속성각 이벤트 클래스 아래에 나열됩니다.