Поделиться через


Включение уведомлений о запросах (ADO.NET)

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

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

  • Используйте SQL Server 2005 или SQL Server 2008.

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

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

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

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

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

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

Электронная документация по SQL Server 2005

Электронная документация по SQL Server 2008

Создание запроса для уведомления

Создание запроса для уведомления

Вопросы безопасности, связанные с компонентом Service Broker

Защита и обеспечение безопасности (компонент Service Broker)

Вопросы безопасности, связанные со службами уведомления

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

Вопросы интернационализации, связанные с компонентом Service Broker

Вопросы проектирования решений (компонент Service Broker)

Информационный центр по компоненту Service Broker для разработчиков

Руководство разработчика (компонент Service Broker)

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

Чтобы включить компонент 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
([https://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 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
// 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;
    }
}

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

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.

См. также

Другие ресурсы

Уведомление о запросах в SQL Server (ADO.NET)