Данные из таблицы в 1 БД необходимы для фильтрации в разных БД
У меня есть Win Form, Data Entry, приложение, которое использует 4 отдельные базы данных. Это периодически подключаемое приложение, которое использует репликацию слиянием (SQL 2005) для синхронизации. Это работает просто отлично. Следующее препятствие, которое я пытаюсь решить, - это добавление фильтров в мои публикации.
Прямо сейчас мы реплицируем 70 МБ сжатых данных каждому из наших 150 подписчиков, когда, по правде говоря, им требуется лишь небольшая часть этого. Используя фильтры, я могу это сделать (см. Код ниже), но для этого мне пришлось составить таблицу сопоставлений. Эта таблица сопоставления состоит из 3 столбцов. PrimaryID(Guid), WorkerName(varchar) и ClientID(int).
Проблема в том, что мне нужно, чтобы эта таблица присутствовала во всех четырех базах данных, чтобы использовать ее для фильтра, поскольку, насколько мне известно, представления или перекрестные запросы в БД не разрешены в выражении фильтра.
Какие у меня варианты?
Похоже, я бы настроил его на сохранение в 1 базе данных, а затем использовал триггеры, чтобы обновлять его в других 3 базах данных. Для того, чтобы быть частью фильтра, я должен включить эту таблицу в набор репликации, чтобы я мог соответствующим образом пометить ее.
Есть ли лучший способ, в целом?
SELECT <published_columns> FROM [dbo].[tblPlan] WHERE [ClientID] IN (select ClientID from [dbo].[tblWorkerOwnership] where WorkerID = SUSER_SNAME())
Что позволяет вам соединять вместе фильтры, этот следующий ниже первого, поэтому он извлекает только из первого фильтрованного набора.
SELECT <published_columns> FROM [dbo].[tblPlan] INNER JOIN [dbo].[tblHealthAssessmentReview] ON [tblPlan].[PlanID] = [tblHealthAssessmentReview].[PlanID]
2 ответа
http://www.sqlservercentral.com/articles/Advanced/designingcrossdatabasequeries/1753/
Вы можете использовать кросс-запросы БД в представлениях.
В зависимости от того, насколько быстро вам понадобятся эти данные фильтра, "реплицированные" на серверах, вы можете создать задание на подчиненных серверах, которое обновит таблицы данными с основного сервера. Вы не будете получать обновления сразу, как с триггерами, но я думаю, что дизайн будет чище.
Например, кросс-запросы к базе данных выполняются как задания на сервере, которые делают простое
DELETE FROM filterTable
а потом
INSERT INTO filterTable ....
обновить таблицу, используемую в фильтрах, по выбранному вами графику.