Работа с WMI Provider for Server Events
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
Глава 8. Мониторинг и оптимизация производительности SQL Server 2008
Мониторинг активности пользователей
|