Язык

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

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

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

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

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

  • Используется 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 и Service Broker разрешения, необходимые для конфигурации очереди. Например, замените placeholder существующим пользователем базы данных:

GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [<database_user>];

Современная платформа .NET не поддерживает безопасность доступа кода. Не используйте SqlClientPermission.Demand для разрешения уведомлений о запросах; настройте разрешения базы данных.

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

Поддержка уведомлений запросов предоставляет два объекта для обработки уведомлений: SqlDependency и SqlNotificationRequest. Используйте SqlDependency для получения событий изменений и инвалидации кэша приложения. Используйте SqlNotificationRequest , когда необходимо реализовать собственный прослушиватель уведомлений.

Important

Не используйте System.Data.SqlClient для новой разработки. Используйте Microsoft.Data.SqlClient вместо этого. Класс ASP.NET Framework SqlCacheDependency требует System.Data.SqlClient и не интегрируется с Microsoft.Data.SqlClient. Для новых приложений Microsoft.Data.SqlClient обрабатывайте SqlDependency.OnChange и обновляйте кэш через API кэша приложения.

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

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

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

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

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

См. также