logo search
SQL2008_Administration

8.1. Мониторинг активности пользователей

WMI Provider for Server Events — это специальный поставщик WMI, основная задача которого заключается в предоставлении доступа через стандартный программный интерфейс WMI к уведомлениям о событиях (event notifications): событиях DDL, событиях трассировки и т.п. При возникновении события сообщение о нем в формате XML помещается в очередь Service Broker. Поэтому для работы этим поставщиком WMI необходимо обязательно включить Service Broker для нужной базы данных.

Просмотреть информацию о том, для каких баз данных включен Service Broker, можно при помощи запроса

USE master

GO

SELECT name, is_broker_enabled FROM sys.databases

Чтобы включить Service Broker, можно воспользоваться командой ALTER DATABASE, например,

ALTER DATABASE AdventureWorks SET ENABLE_BROKER

Пример использования WMI Provider for Server Events.

Необходимо производить мониторинг любых изменений, вносимых в структуру любой таблицы БД DB1 на сервере LONDON2\SQL2008 и немедленно получать информацию об имени изменившейся таблицы, имени пользователя, который внес изменения и команде Transact-SQL, с помощью которой было произведено данное изменение.

Создадим приложение, которое будет реагировать на такое изменение, следующим образом.

  1. Создадим новый проект .NET, воспользовавшись шаблоном для языка Visual Basic.NET, который называется Console Application.

  2. Добавим в проект сслыку на сборку с необходимыми классами для работы с WMI. Для этого в меню Project (Проект) в Visual Studio.NET нужно выбрать команду Add Reference (Добавить ссылку), на вкладке .NET выбрать пространство имен System.Management и нажать на кнопку OK.

  3. Создадим программный код. Программый код модуля NewModule.vbs, может выглядеть так:

Imports System

Imports System.Management

Module NewModule

Sub Main()

'Создаем объект диапазона и подключаемся к пространству имен

'WMI Provider for Server Events на локальном сервере

'для экземпляра SQL2008

Dim oScope As New ManagementScope("\\.\root\Microsoft\SqlServer\ServerEvents\SQL2008")

oScope.Connect()

'Определяем объект событийного запроса WQL

Dim oQuery As New WqlEventQuery("SELECT * FROM ALTER_TABLE WHERE DatabaseName = 'DB1'")

'Определяем объект наблдюдателя за событием и передаем ему запрос

Dim oWatcher As New ManagementEventWatcher(oQuery)

'Определяем диапазон наблюдения для объекта наблюдателя

oWatcher.Scope = oScope

'Сигнализируем о начале наблюдения

Console.WriteLine("Начинаем мониторинг")

Dim oBaseObject As ManagementBaseObject

'Начинаем перехват событий в бесконечном цикле

Dim i As Integer

i = 0

Do While i = 0

oBaseObject = oWatcher.WaitForNextEvent()

'Выводим нужные свойства объекта, для которого произошло событие

Console.WriteLine(oBaseObject.Properties("ObjectName").Value & _

vbCrLf & oBaseObject.Properties("TSQLCommand").Value)

Loop

End Sub

End Module