Мне нравится звук вашей SqlCacheDependency, но я отвечу на это с другой точки зрения, так как я работал с командой над похожим сценарием. Мы создали базу данных master и использовали триггеры для создания XML-представлений данных, которые были изменены в master, и сохранили их в таблице TransactionQueue с небольшим количеством метаданных о том, что изменилось, когда и кто их изменил. Клиентские базы данных будут периодически проверять очередь на предмет интересующих ее элементов, обрабатывать XML и обновлять собственные таблицы по мере необходимости.
Мы также сделали то же самое для клиента, чтобы обновить мастер. Мы настроили триггеры и таблицу TransactionQueue в клиентских базах данных для отправки данных обратно в мастер. Это, в свою очередь, обновит все другие клиентские базы данных при следующем опросе.
Приятно то, что он довольно независим от клиентской платформы и структуры клиентских данных, поэтому мы смогли использовать этот метод в ряде устаревших и сторонних систем. Другим важным моментом здесь является то, что вы можете вывести любую из баз данных из цикла (включая основную - например, сбой соединения), а остальные все равно будут работать нормально. Это хорошо сработало для нас, поскольку наша основная база данных находилась за нашим корпоративным брандмауэром, а более простые веб-базы данных находились у нашего интернет-провайдера.
Очевидно, что у этого подхода есть свои минусы, такие как расовая опасность, поэтому мы тщательно следили за порядком обработки транзакций, обработки ошибок, дедупликации и т. Д. Мы также создали графический интерфейс управления, чтобы обеспечить уровень взаимодействия с человеком до того, как важные данные изменилось в мастере.
Удачи! Тим