Уведомление об изменениях с Sql Server 2008 - PullRequest
35 голосов
/ 18 мая 2009

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

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

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

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

Ответы [ 4 ]

18 голосов
/ 15 ноября 2009

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

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

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

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

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

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

3 голосов
/ 28 мая 2009

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

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

3 голосов
/ 18 мая 2009

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

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

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

2 голосов
/ 27 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...