#c# #sql #sql-server-2008 #synchronization
#c# #sql #sql-server-2008 #синхронизация
Вопрос:
Я хочу синхронизировать 2 записи, относящиеся к конкретной базе данных. Предположим, у меня есть две базы данных;
1.Shop
2.Stock
Теперь давайте предположим, что пользователь изменяет цену определенного продукта на складе. Я также хочу изменить цену на этот продукт в магазине!
Что я решаю, так это то, что — предполагая, что подключение к Интернету стабильно,
- При изменении цены на складе я вызываю веб-сервис, который вставляет записи в таблицу веб-данных price.
- Теперь на стороне магазина я проверяю эту таблицу веб-данных с помощью веб-сервиса каждые 20 минут, если я нахожу какую-либо новую запись, я обновляю соответствующую цену товара в магазине!
Другим вариантом, о котором я думал, была репликация. Но мы используем экспресс-версию SQL Server, и, насколько мне известно, express Edition не может работать как publisher!
Эффективен ли мой первый вариант для этой цели или я что-то упускаю, и есть лучшая альтернатива для достижения этой цели!
Комментарии:
1. Репликация или service broker — очевидные инструменты для этой работы, но, как вы уже определили, для их работы требуется по крайней мере одна версия SQL Server, не являющаяся express.
2. Это может быть для администратора базы данных. SE, но может потребоваться решение, не связанное с базой данных, если версии SQL операционной системы не могут выполнять репликацию. Итак, я на данный момент ухожу отсюда.
Ответ №1:
У вас мог бы быть триггер в таблице, как сказал pRime выше, но вместо прямой записи в другую базу данных записывайте изменения в локальную «промежуточную» таблицу, а затем каждые 20 минут или около того планируйте задачу для отправки обновлений во вторую базу данных.
Вы могли бы настроить вторую базу данных как связанный сервер.
Таким образом, вы избегаете перевода таблицы в режим «Только для чтения», если соединение между двумя базами данных прерывается.
Ответ №2:
вы можете создать триггер в таблице Stock.
CREATE TRIGGER triggerName
ON [Stock].[dbo].[products]
AFTER UPDATE
AS
IF ( UPDATE (productPrice))
BEGIN
--insert to shop
END
GO
Комментарии:
1. просто из любопытства — будет ли это также работать, если две базы данных находятся на другом сервере и / или за брандмауэром?
2. я не уверен насчет брандмауэра, но для разных серверов (серверы должны быть связаны вместе) вы можете явно ссылаться на таблицы как servername.databasename.tablename .. но это может иметь некоторые проблемы с производительностью… вместо этого вы можете использовать репликацию…
3. Обычно я бы не рекомендовал запускать триггеры между базами данных , не говоря уже о кросс- сервере — если сетевое соединение обрывается, вы фактически делаете эту таблицу доступной только для чтения, и ошибки, которые она выдает, будут забавными.
4. @Damien Что ты предлагаешь? Я действительно заинтересован в этом
5. @Uw — Я бы настоятельно рекомендовал перейти с Express edition на версию, поддерживающую репликацию и / или service broker, а затем использовать любую из них. Какая из них будет зависеть от частоты обновлений, требований к задержке и т.д. Попытка самостоятельно создать что-то надежное, что будет хорошо работать через брандмауэры и т.д. И справляться, например, с перебоями в работе сети, Обычно требует слишком больших усилий по сравнению с испытанными компонентами.
Ответ №3:
ЕСЛИ не удается использовать функцию репликации MS SQL Server (требуется какая-либо версия, не являющаяся Express, как вы уже определили) для этой ситуации (см.http://msdn.microsoft.com/en-us/library/ms151198.aspx ) тогда другим вариантом является использование MS Sync Framework (может работать с базами данных вплоть до SQL CE и т.д., файлами, Даже пользовательскими источниками данных и т.д.) — см. http://msdn.microsoft.com/en-us/library/bb726002.aspx .
ЕСЛИ вы действительно хотите реализовать это в коде самостоятельно (я настоятельно рекомендую этого не делать), тогда реализуйте это как «push-сценарий» :
- Триггеры БД, которые заполняют промежуточные таблицы
- Служба Windows, которая проверяет наличие изменений в промежуточных таблицах и применяет их к
- правила разрешения конфликтов
- завершите протоколирование всего этого, чтобы иметь возможность анализировать несоответствия (на всякий случай)