|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
9.4.8. Работа с WMI Provider for Server EventsПоставщик WMI Provider for Server Events, обращение к Service Broker, метод WQLEventQuery(), объект ManagementEventWatcher WMI Provider for Server Events — это специальный поставщик WMI, основная задача которого заключается в предоставлении доступа через стандартный программный интерфейс WMI к уведомлениям о событиях (event notifications). Про уведомления о событиях будет рассказываться в разд. 11.2.5. Здесь только отметим, что при помощи уведомлений о событиях можно производить мониторинг событий двух видов: событий DDL и событий трассировки. События DDL связаны с созданием, изменением и удалением объектов базы данных. События трассировки — это те события, которые можно отследить средствами SQL Server Profiler (см. разд. 11.2.3). Событий трассировки очень много. В качестве примеров таких событий можно привести подключение пользователя к серверу, изменение размера базы данных или журнала транзакций, выполнение запроса или запуск на выполнение хранимой процедуры, возникновение взаимоблокировки, пользовательской или системной ошибки и т. п. WMI Provider for Server Events — это всего лишь внешняя программная оболочка, поэтому при выполнении запроса к объектам этого поставщика создается уведомление о событиях в соответствующей базе данных. При возникновении события сообщение о нем в формате XML помещается в очередь Service Broker. Поэтому для работы с этим поставщиком WMI необходимо обязательно включить Service Broker. Если вы собираетесь отслеживать события для конкретной базы данных, то нужно включить Service Broker для нее, а если вы планируете отслеживать события на уровне всего сервера, то вам потребуется включить Service Broker для базы данных msdb. Просмотреть информацию о том, для каких баз данных включен 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\SQL2005 и сразу же получать информацию об имени изменившейся таблицы, имени пользователя, который внес изменения, и команде Transact-SQL, которая произвела это изменение. Создать приложение, которое будет реагировать на такое изменение, можно следующим образом. Первое, что нужно сделать, — создать новый проект .NET. Достаточно выбрать самый простой вариант и воспользоваться шаблоном для языка Visual Basic.NET, который называется Console Application (Консольное приложение). Далее нужно добавить в проект ссылку на сборку с необходимыми классами для работы с WMI. Для этого в меню Project (Проект) в Visual Studio.NET выберите команду Add Reference, на вкладке .NET выберите пространство имен System.Management и нажмите кнопку OK. После того как ссылка будет добавлена, можно приступать к созданию программного кода. Весь программый код модуля Module1.vb, может выглядеть так: Imports System Imports System.Management
Module Module1 Sub Main() 'Создаем объект диапазона и подключаемся к пространству имен 'WMI Provider for Server Events на локальном сервере 'для экземпляра SQL2005 Dim oScope As New ManagementScope("\\.\root\Microsoft\SqlServer\ServerEvents\SQL2005") 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
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||