У вас действительно не так много способов обнаружить изменения в SQL 2005. Большинство из них вы уже перечислили.
Уведомления о запросах . Это технология, которая поддерживает SqlDependency и его производные, вы можете прочитать подробности на Таинственное уведомление . Но QN предназначен для аннулирования результатов, а не для предварительного уведомления об изменении содержимого. Вы будете знать только, что в таблице есть изменения, не зная, что изменилось. В загруженной системе это не будет работать, так как уведомления будут приходить постоянно.
Чтение журнала . Это то, что использует репликация транзакций и является наименее навязчивым способом обнаружения изменений. К сожалению, доступно только для внутренних компонентов. Даже если вам удастся понять формат журнала, проблема заключается в том, что вам нужна поддержка движка, чтобы пометить журнал как «используемый», пока вы его не прочитаете, или он может быть перезаписан. Только транзакционная репликация может сделать такую специальную маркировку.
Сравнение данных . Положитесь на столбцы меток времени, чтобы обнаружить изменения. Он также работает на основе запросов, довольно навязчив и имеет проблемы с обнаружением удалений.
Прикладной уровень . Это лучший вариант в теории, если только нет изменений в данных, выходящих за рамки приложения, и в этом случае они разрушаются. На практике всегда изменения происходят вне области применения.
Триггеры . В конечном счете, это единственный жизнеспособный вариант. Все механизмы изменений, основанные на триггерах, работают одинаково, они помещают в очередь уведомление об изменениях в компонент, который отслеживает очередь.
Всегда есть предложения сделать тесно связанные синхронные уведомления (через xp_cmdshell, xp_olecreate, CLR, уведомить с помощью WCF, вы называете это), но все эти схемы на практике не работают, потому что они в корне ошибочны:
- они не учитывают согласованность транзакций и откатов
- они вводят зависимости доступности (система OLTP не может работать, пока уведомленный компонент не подключен)
- они работают ужасно, так как каждая операция DML должна ждать завершения вызова RPC какой-либо формы
Если триггеры на самом деле не активно уведомляют слушателей, а только ставят в очередь уведомления, возникает проблема с мониторингом очереди уведомлений (когда я говорю «очередь», я имею в виду любую таблицу, которая действует как очередь). Мониторинг подразумевает выборку новых записей в очереди, что означает правильное соотношение частоты проверок с нагрузкой изменений и реагирование на скачки нагрузки. Это совсем не тривиально, на самом деле это очень сложно. Однако есть один оператор на SQL-сервере, который имеет семантику, которую нужно блокировать, не вытягивая, пока не станут доступны изменения: WAITFOR (RECEIVE) . Это означает, что Service Broker. Вы упоминали SSB несколько раз в своем посте, но, по правде говоря, боитесь его развернуть из-за большого неизвестного. Но реальность такова, что она, безусловно, лучше всего подходит для задачи, которую вы описали.
Вам не нужно развертывать полную архитектуру SSB, где уведомление доставляется до удаленного сервиса (для этого все равно потребуется удаленный экземпляр SQL, даже экспресс). Все, что вам нужно сделать, это отделить момент, когда изменение обнаружено (триггер DML), с момента доставки уведомления (после того, как изменение зафиксировано). Для этого все, что вам нужно, это локальная очередь и служба SSB. В триггере вы ОТПРАВЛЯЕТЕ уведомление об изменении локальной службы. После фиксации исходной транзакции DML сервисная процедура активирует и доставляет уведомление, например, с использованием CLR. Вы можете увидеть пример чего-то подобного на Асинхронный T-SQL .
Если вы идете по этому пути, вам нужно научиться некоторым приемам, чтобы достичь высокой производительности, и вы должны осознать концепцию упорядоченной доставки сообщений в SSB. Я рекомендую вам прочитать эти ссылки:
Что касается средств обнаружения изменений, SQL 2008 , по-видимому, добавляет новые опции: Сбор данных изменений и отслеживание изменений . Я подчеркиваю «по-видимому», поскольку они не являются действительно новыми технологиями. CDC использует программу чтения журнала и основана на существующих механизмах репликации транзакций. CT использует триггеры и очень похож на существующие механизмы репликации Merge. Они оба предназначены для иногда подключенных систем, которые должны синхронизироваться и, следовательно, не подходить для уведомления об изменениях в реальном времени. Они могут заполнять таблицы изменений, но у вас остается задача следить за изменениями в этих таблицах, что именно с того места, с которого вы начали.