Запись обновления двунаправленной репликации

Я хотел бы представить вам свою проблему, связанную с двунаправленной репликацией SQL Server 2005. Что мне нужно? Мой руководитель группы хочет решить одну из наших проблем, используя двунаправленную репликацию между двумя базами данных, каждая из которых используется другим приложением. Одно приложение создает записи в таблице A, изменения должны реплицироваться во вторую базу данных в копию таблицы A. Когда данные на втором сервере изменяются, эти изменения должны быть распространены обратно на первый сервер. Я пытаюсь добиться двунаправленной репликации транзакций между двумя базами данных на одном сервере, на котором работает SQL Server 2005. Мне удалось настроить это с помощью сценариев, установить 2 публикации и 2 подписки только для чтения с обнаружением петли. БД раздачи создана, включена публикация в обе БД. Дистрибьютор и издатель готовы. Мы используем некоторые правила для управления тем, какие записи будут реплицироваться, поэтому нам нужно вызывать наши пользовательские хранимые процедуры во время репликации. Таким образом, статьи настроены на обновление, вставку и удаление пользовательских хранимых процедур.

Пока все хорошо, но?

Все работает нормально, изменения реплицируются, пока не будут выполнены обновления на обеих таблицах одновременно или до того, как изменения реплицируются (а это занимает около 3-6 секунд). Затем обе записи имеют разные значения.

UPDATE db1.dbo.TestTable SET Col = 4 WHERE ID = 1
UPDATE db2.dbo.TestTable SET Col = 5 WHERE ID = 1

приводит к:

db1.dbo.TestTable COL = 5

db2.dbo.TestTable COL = 4

Но мы хотим иметь репликацию, выигравшую последнее изменение. Пожалуйста, есть способ решить мою проблему? Как я могу обеспечить одинаковые значения в обеих записях? Или есть более простое решение, чем такая репликация?

Я могу предоставить пример сценария репликации, который я использую.
Жду ваших идей,
Мирек


person Mirek    schedule 07.10.2009    source источник


Ответы (1)


Я думаю, что добавление поля dateUpdated в обе таблицы может помочь. Таким образом, в вашем коде репликации запись будет обновляться только в том случае, если dateUpdated больше, чем уже сохраненная.

Это поле dateUpdated, очевидно, будет хранить дату и время, когда исходная запись была обновлена, а не когда была выполнена репликация.

person kristof    schedule 07.10.2009
comment
Но это будет означать, что я должен делать все обновления с обновлением столбца, содержащего это значение даты и времени, я прав? - person Mirek; 08.10.2009
comment
@Mirek: если вы последуете совету Кристофа, вам понадобится триггер INSTEAD OF с предложением NOT FOR REPLICATION. - person filiprem; 22.12.2009