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


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

Приложения, использующие уведомления о запросах, имеют общий набор требований. Источник данных должен быть правильно настроен для поддержки уведомлений 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 произойдет во время выполнения, если все вызывающие функции выше по стеку вызовов не имеют разрешения.

// 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компонент Service Broker должен быть включен для используемой базы данных SQL Server, и у пользователей должны быть разрешения на получение уведомлений. Объекты Service Broker, такие как очередь уведомлений, предопределены.

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

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

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

См. также