Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Репликация. Как обеспечивается целостность данных?  [new]
Сергей ДД
Member

Откуда: Москва
Сообщений: 207
Здравствуйте.
Вопрос такой:
Допустим есть 2-е таблицы, первая из который содержит первичные ключи для полей второй таблицы.
Как будет проходить репликация, если на "паблишере" добавились данные в обе таблицы.
Вопросы:
1) Не может ли произойти такой ситуации, что он начнет реплицировать сначала таблицу вторую, ту которая содержит внешние ключи. А в первой таблице ведь еще нет соответствующих первичных ключей? Не произойдет ли при этом нарушение целостность данных?
2) Видел галочку в свойствах связей "Применить связь при репликации". Она случайно не для этого существует? Может ее необходимо убрать, чтобы не было таких проблем?
Заранее спасибо!
1 июн 05, 13:25    [1587810]     Ответить | Цитировать Сообщить модератору
 Re: Репликация. Как обеспечивается целостность данных?  [new]
Александр Азаркович
Member

Откуда:
Сообщений: 208
Опция NOT FOR REPLICATION.
Именно для этого.
1 июн 05, 15:00    [1588283]     Ответить | Цитировать Сообщить модератору
 Re: Репликация. Как обеспечивается целостность данных?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Если речь идет о merge репликации, то см. цитату вот отсюда: Enhancing Merge Replication Performance

BOL
Controlling Article Processing Order If Using Triggers for Referential Integrity
When publishing tables related to one another via declared foreign key constraints or constraints enforced via triggers, the Merge Agent will need to apply changes to related rows in the correct order to propagate all changes. If you are using declared referential integrity, SQL Server will process articles in order based on the relationships. By processing articles in the optimal order based on the action being performed (for example, inserting parent rows before related child rows), the Merge Agent can avoid additional retry operations when processing articles during synchronizing.

If declared referential integrity is not used, the Merge Agent will, by default, process articles in the order they are added to a publication via stored procedures or SQLDMO – article order cannot be controlled through SQL Server Enterprise Manager.

If triggers are used to enforce referential integrity, the Merge Agent will not recognize this as declared referential integrity, and you need to be aware of the processing order of the articles.


Если речь идет о транзакционной репликации, то см. цитату вот отсюда: How Transactional Replication Works

BOL
Subscribers will receive transactions in the same order in which they were applied at the Publisher.


То есть для обоих типов репликации согласно документации можно утверждать, что если foreign keys одинаковы на всех участниках репликации, то данные будут приходить по репликации в правильном порядке, в соответствии с этими foreign keys.

Если у вас есть расхождения в структурах таблиц, в констрейнтах и т.д. на реплицируемых серверах, либо не все связанные таблицы включены в публикацию, то вы можете, например, получать constraint violation при некоторых данных. Но это уже будет чисто ваша ошибка как проектировщика, никак не относящаяся к корректной работе сиквела.

На форуме иногда народ утверждал, что видел сбои в правильном порядке доставки данных - т.е. нарушение foreign key в то время, как на самом деле исходные данные нормальные. Мне за несколько лет плотной работы с merge репликацией такого видеть не доводилось.

Сергей ДД
Видел галочку в свойствах связей "Применить связь при репликации". Она случайно не для этого существует? Может ее необходимо убрать, чтобы не было таких проблем?

Она разрешает или запрещает проверку foreign key для изменений данных, которые происходят не локально, а приходят по репликации. Включать ее или нет, зависит от структуры вашей публикации.

Примеры, когда ее бывает нужно отключить:
1. Есть две таблицы, связанные foreign key. В публикацию включена только дочерняя.
2. Структуры баз, участвующих в репликации, не совсем идентичны. Например, различные констрейнты, триггера, и др. Тогда данные, вполне валидные на одном сервере, будут невалидны на другом. Это относится и к foreign key в частности.
3. Ускорение работы merge агента. Полюбопытствуйте в профайлере, какие дополнительные действия производятся на подписчике, когда ему приходят данные, которые должны быть провалидированы на предмет выполнения foreign key. Поучительное зрелище. Также сравните время работы агента с включенной и выключенной опцией.

Очень хороший пример, когда отключать нельзя, относится к репликации с горизонтальным фильтром: https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=182966#1543893
1 июн 05, 15:03    [1588302]     Ответить | Цитировать Сообщить модератору
 Re: Репликация. Как обеспечивается целостность данных?  [new]
Сергей ДД
Member

Откуда: Москва
Сообщений: 207
2 GreenSunrise.
Благодарю за столь полный ответ!
Вроде пока все понятно. Но как начну экспериментировать, может еще чего появиться неясного.
Еще раз спасибо!
1 июн 05, 15:37    [1588470]     Ответить | Цитировать Сообщить модератору
 Re: Репликация. Как обеспечивается целостность данных?  [new]
lesha
Member

Откуда:
Сообщений: 157
Работаю с merge репликацией год, и когде не пользовался опцией not for replication сталкивался с такой проблемой, что когда приходили данные с подписчика, то данные всавлялись именно в обратном порядке (сначала дочка потом мама).

В итоге репликация не проходила, и на подписчике грохались эти записи.....


после not for replication все гууд, тьфу, тфу. Чтоб не сглазить :-)
2 июн 05, 11:21    [1590762]     Ответить | Цитировать Сообщить модератору
 Re: Репликация. Как обеспечивается целостность данных?  [new]
Сергей ДД
Member

Откуда: Москва
Сообщений: 207
lesha
Работаю с merge репликацией год, и когде не пользовался опцией not for replication сталкивался с такой проблемой, что когда приходили данные с подписчика, то данные всавлялись именно в обратном порядке (сначала дочка потом мама).

В итоге репликация не проходила, и на подписчике грохались эти записи.....


после not for replication все гууд, тьфу, тфу. Чтоб не сглазить :-)

Что ж ответы у всех такие разные??? Кот прав???
3 июн 05, 14:11    [1595030]     Ответить | Цитировать Сообщить модератору
 Re: Репликация. Как обеспечивается целостность данных?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
В продолжение темы. Вот очень хорошая статья. Там даже объясняется, почему, несмотря на соблюдение внешних ключей и поколений изменений могут быть проблемы: INF: Understanding Merge Replication Article Processing Order
16 июн 05, 11:14    [1624171]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить