Включение уведомлений запросов

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

Чтобы использовать уведомления о запросах, сделайте следующее:

  • Включите уведомления о запросах для своей базы данных.

  • Предоставьте идентификатору пользователя, используемому для подключения к базе данных, необходимые разрешения.

  • Используйте объект SqlCommand для выполнения допустимой инструкции SELECT со связанным объектом уведомления: SqlDependency или SqlNotificationRequest.

  • Укажите код для обработки уведомления в случае изменения отслеживаемых данных.

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

Уведомления о запросах поддерживаются только для инструкций SELECT, которые соответствуют конкретным требованиям. В следующей таблице приведены ссылки на документацию по Service Broker и уведомлениям о запросах в документации ПО SQL Server.

Документация по SQL Server

Включение уведомлений о запросах для запуска примеров кода

Чтобы включить компонент Service Broker для базы данных AdventureWorks с помощью среды SQL Server Management Studio, выполните следующую инструкцию Transact-SQL.

ALTER DATABASE AdventureWorks SET ENABLE_BROKER;

Для правильного запуска примеров уведомлений о запросах необходимо выполнить на сервере базы данных приведенные ниже инструкции Transact-SQL.

CREATE QUEUE ContactChangeMessages;  
  
CREATE SERVICE ContactChangeNotifications  
  ON QUEUE ContactChangeMessages  
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);  

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

Пользователям, выполняющим команды для запроса уведомлений, необходимо разрешение базы данных SUBSCRIBE QUERY NOTIFICATIONS на сервере.

Код на стороне клиента, который выполняется в случае частичного доверия, требует разрешения SqlClientPermission.

Следующий код создает объект SqlClientPermission, устанавливая для PermissionState значение Unrestricted. Demand принудительно создает SecurityException во время выполнения, если все вызывающие методы, расположенные выше в стеке вызовов, не получили разрешения.

// Code requires directives to
// System.Security.Permissions and
// System.Data.SqlClient

private bool CanRequestNotifications()
{
    SqlClientPermission permission =
        new SqlClientPermission(
        PermissionState.Unrestricted);
    try
    {
        permission.Demand();
        return true;
    }
    catch (System.Exception)
    {
        return false;
    }
}
' Code requires directives to
' System.Security.Permissions and
' System.Data.SqlClient

Private Function CanRequestNotifications() As Boolean

    Dim permission As New SqlClientPermission( _
      PermissionState.Unrestricted)

    Try
        permission.Demand()
        Return True
    Catch ex As Exception
        Return False
    End Try

End Function

Выбор объекта уведомления

API-интерфейс уведомлений о запросах предоставляет два объекта для обработки уведомлений: SqlDependency и SqlNotificationRequest. В общем случае в большинстве приложений, не основанных на ASP.NET, следует использовать объект SqlDependency. В приложениях ASP.NET следует использовать объект более высокого уровня SqlCacheDependency, который является оболочкой для SqlDependency и предоставляет платформу для администрирования объектов уведомлений и кэша.

Использование SqlDependency

Чтобы вы могли использовать объект SqlDependency, в используемой базе данных SQL Server должен быть включен компонент Service Broker, а пользователи должны иметь права для получения уведомлений. Объекты компонента Service Broker, такие как очередь уведомлений, предопределены.

Кроме того, объект SqlDependency автоматически запускает рабочий поток для обработки уведомлений по мере их поступления в очередь. Он также проводит синтаксический анализ сообщения компонента Service Broker, предоставляя данные в виде аргументов событий. Экземпляр SqlDependency создается путем вызова метода Start, который устанавливает зависимость с базой данных. Это статический метод, который необходимо вызывать только один раз во время инициализации приложения для каждого требуемого подключения к базе данных. Метод Stop необходимо вызывать при завершении приложения для каждого установленного подключения зависимости.

Использование SqlNotificationRequest

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

См. также