Работа с уведомлениями о запросах

Область применения: SQL Server

Скачать драйвер OLE DB

Уведомления о запросах появились в SQL Server 2005 (9.x) и OLE DB Driver for SQL Server. Они опираются на инфраструктуру SQL Service Broker, появившуюся в SQL Server 2005 (9.x), и позволяют приложениям узнавать об изменении данных. Данная возможность полезна для приложений, которые кэшируют информацию из базы данных (например, веб-приложения), и которым требуются уведомления об изменении исходных данных.

С помощью уведомлений о запросах можно запрашивать уведомления в течение указанного времени ожидания при изменении базовых данных запроса. В запросе указываются параметры уведомления, включающие имя службы, текст сообщения и значение времени ожидания для сервера. Доставка уведомлений осуществляется через очередь Service Broker, которую приложения могут опрашивать на наличие уведомлений.

Строка параметров уведомлений запросов имеет следующий синтаксис.

service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]

Например:

service=mySSBService;local database=mydb

Подписки на уведомления существуют дольше процесса, который их запускает. Это связано с тем, что приложение может создать подписку на уведомления, а затем завершить работу. Подписка остается действительной, и уведомление отправляется в случае изменения данных в течение указанного времени ожидания. Уведомление определяется выполненным запросом, параметрами уведомления, а также текстом сообщения. Его можно отменить, установив нуль в качестве значения времени ожидания.

Уведомления отправляются только один раз. Чтобы получать постоянные уведомления об изменении данных, необходимо создавать новую подписку путем повторного выполнения запроса после обработки каждого уведомления.

Приложения OLE DB Driver for SQL Server обычно получают уведомления с помощью команды Transact-SQL RECEIVE. Эта команда используется для считывания уведомлений из очереди, связанной со службой, которая указана в параметрах уведомлений.

Примечание.

В запросах нужно указывать имена таблиц, для которых необходимы уведомления. Например, dbo.myTable. Имена таблиц должны состоять из двух частей. Подписка будет недействительной в случае использования трех- или четырехкомпонентных имен.

Инфраструктура уведомлений построена на основе функции очереди, представленной в SQL Server 2005 (9.x). Как правило, формируемые на сервере уведомления отправляются через эти очереди для последующей обработки.

Для использования уведомлений о запросах на сервере должны существовать очередь и служба. Эти элементы можно создать при помощи команды Transact-SQL следующим образом:

CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])

Примечание.

Служба должна использовать стандартный контракт, как показано выше.

Драйвер OLE DB для SQL Server

OLE DB Driver for SQL Server поддерживает уведомления потребителя об изменении набора строк. Объекту-получателю приходит уведомление на каждом этапе изменения набора строк и при каждой попытке внести изменение.

Примечание.

Передача серверу запроса на уведомления с помощью ICommand::Execute является единственным допустимым способом подписки на уведомления о запросах с помощью драйвера OLE DB для SQL Server.

Набор свойств DBPROPSET_SQLSERVERROWSET

Чтобы обеспечить поддержку уведомлений о запросах через OLE DB, драйвер OLE DB Driver for SQL Server добавляет в набор свойств DBPROPSET_SQLSERVERROWSET следующие новые свойства.

Имя. Тип Описание
SSPROP_QP_NOTIFICATION_TIMEOUT VT_UI4 время в секундах, в течение которого уведомление запроса должно оставаться активным.

Значение по умолчанию — 432 000 секунд (5 дней). Минимальное значение — 1 секунда, а максимальное значение — 2^31-1 секунд.
SSPROP_QP_NOTIFICATION_MSGTEXT VT_BSTR Текст сообщения уведомления. Этот текст определяется пользователем и не имеет стандартного формата.

По умолчанию эта строка пуста. Укажите сообщение с помощью символов от 1 до 2000.
SSPROP_QP_NOTIFICATION_OPTIONS VT_BSTR параметры уведомлений о запросах. Эти параметры указываются в строке с использованием синтаксиса имя=значение. За создание службы и считывание уведомлений из очереди отвечает пользователь.

Значением по умолчанию является пустая строка.

Подписка на уведомления всегда фиксируется. Это не зависит от того, выполнялась ли инструкция в рамках пользовательской транзакции или в режиме автофиксации, а также была ли транзакция, в рамках которой выполнялась инструкция, зафиксирована либо был выполнен ее откат. Уведомление сервера срабатывает при возникновении любого из следующих недопустимых условий: изменение базовых данных или схемы либо по истечении времени ожидания, в зависимости от того, что произойдет первым.

Регистрации уведомлений удаляются сразу же после их срабатывания. Поэтому при получении уведомления приложение должно вновь подписаться, чтобы получать дальнейшие сведения.

Другое соединение или поток может проверять целевую очередь на наличие уведомлений. Рассмотрим пример.

WAITFOR (RECEIVE * FROM MyQueue); -- Where MyQueue is the queue name.

Примечание.

Инструкция SELECT * не удаляет запись из очереди. Тем не менее инструкция RECEIVE * FROM удаляет. Если очередь пуста, поток сервера будет остановлен. Если во время вызова есть записи очереди, они возвращаются немедленно. В противном случае вызов ожидает до тех пор, пока не будет выполнена запись в очередь.

RECEIVE * FROM MyQueue

Если очередь пуста, то эта инструкция немедленно возвращает пустой результирующий набор. В противном случае она возвращает все уведомления в очереди.

Если значения свойств SSPROP_QP_NOTIFICATION_MSGTEXT и SSPROP_QP_NOTIFICATION_OPTIONS не равны NULL и не являются пустыми, на сервер отправляется заголовок потока табличных данных уведомлений о запросах, содержащий три свойства, указанные выше. Этот заголовок отправляется при каждом выполнении команды. Если значение любого из них равно NULL (или пустое), заголовок не отправляется, а формируется DB_E_ERRORSOCCURRED (или DB_S_ERRORSOCCURRED, если оба свойства обозначены как необязательные). Для значения состояния устанавливается DBPROPSTATUS_BADVALUE. Поверка выполняется в случае команды Execute или Prepare. DB_S_ERRORSOCCURED Аналогичным образом возникает, когда свойства уведомления запроса задаются для подключений к версиям SQL Server до SQL Server 2005 (9.x). Значение состояния в таком случае — DBPROPSTATUS_NOTSUPPORTED.

Оформление подписки не гарантирует доставку сообщений в будущем. Кроме того, допустимость указанного имени службы не проверяется.

Примечание.

При подготовке инструкций подписка никогда не запускается. Запуск подписки происходит только при выполнении инструкций. Использование базовых служб OLE DB не оказывает влияния на уведомления о запросах.

Дополнительные сведения о наборе свойств DBPROPSET_SQLSERVERROWSET см. в статье Rowset Properties and Behaviors (Свойства и поведение набора строк).

См. также

Возможности драйвера OLE DB для SQL Server