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

Скачать ADO.NET

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

using Microsoft.Data.SqlClient;
using System.Security.Permissions;

class Program
{
    static void Main()
    {
    }

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

    private bool CanRequestNotifications()
    {
        SqlClientPermission permission =
            new SqlClientPermission(
            PermissionState.Unrestricted);
        try
        {
            permission.Demand();
            return true;
        }
        catch (System.Exception)
        {
            return false;
        }
    }
}

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

API-интерфейс уведомлений о запросах предоставляет два объекта для обработки уведомлений: SqlDependency и SqlNotificationRequest.

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

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

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

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

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