Уведомление об изменениях с Sql Server 2008

У меня есть приложение, которое состоит из базы данных и нескольких служб. Один из этих сервисов добавляет информацию в базу данных (запускается пользователем).

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

До сих пор я использовал настраиваемый таймер, который запрашивает базу данных каждые 30 секунд или около того. Я читал о Sql 2005 с уведомлением об изменениях. Однако в Sql 2008 эта функция устарела.

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

4 ответа

Службы Notification Services устарели, но вы все равно не хотите их использовать.

Вы могли бы рассмотреть сообщения Service Broker в некоторых сценариях; детали зависят от вашего приложения.

В большинстве случаев вы, вероятно, можете использовать SqlDependency или SqlCacheDependency. Они работают так, что вы включаете объект SqlDependency в свой запрос при его выдаче. Запрос может быть одиночным SELECT или сложной группой команд в хранимой процедуре.

Некоторое время спустя, если другой веб-сервер или пользователь или веб-страница изменят базу данных, что может привести к изменению результатов предыдущего запроса, SQL Server отправит уведомление всем серверам, которые зарегистрировали объекты SqlDependency. Вы можете либо зарегистрировать код для запуска при получении этих событий, либо событие может просто очистить запись в кэше.

Хотя вам нужно разрешить компоненту Service Broker использовать SqlDependency, вам не нужно явно взаимодействовать с ним. Тем не менее, вы также можете использовать его в качестве альтернативного механизма; Думайте об этом больше как о постоянной системе обмена сообщениями, которая гарантирует порядок сообщений и единовременную доставку.

Детали того, как использовать эти системы, немного длинны для сообщения на форуме. Вы можете использовать Google для них или я также привожу примеры в своей книге ( Ultra-Fast ASP.NET).

Да, этот пост в блоге объясняет, что Notification Services теперь устарела, а также какие замены или альтернативы будут в будущем.

Для ваших целей - получение уведомлений об изменениях, произошедших в базе данных - звучит так, будто вы хотите отслеживать изменения в SQL Server. Но уведомление является моделью извлечения - ваше приложение должно выполнить запрос к таблице изменений.

Мне не удалось выяснить, продолжает ли SqlDependency работать с устаревшими службами Notification Services.

Существует несколько различных способов отслеживания изменений в базе данных: либо с помощью триггеров, которые поддерживают временные структуры, такие как резервные копии, журналы отслеживания (так называемые "таблицы аудита"), либо с помощью средств отслеживания изменений в SQL 2008 в качестве ссылок в другом ответе. Независимо от того, какой механизм вы используете, у вас есть проблема с уведомлением вашей домашней службы об изменении. Для этого вы можете использовать компонент Service Broker и активацию на основе событий. Из того, что вы описываете, кажется, что приложение ждет события из очереди. http://msdn.microsoft.com/en-us/library/ms171581.aspx

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

Вы можете использовать System.Data.SqlClient.SqlDependency (который работает с Service Broker), чтобы подписаться на изменения в таблице.

Другие вопросы по тегам