Настройка репликации MSSQL с одноранговой топологией: проблема с настройкой обнаружения конфликтов
Я настраиваю стратегию SQL Replication, используя MSSQL2008 с одноранговыми публикациями (2 сервера, каждый подписывается на другой).
Я следовал этому HOWTO от MSDN, и настройка, кажется, работает нормально: добавьте запись в одну таблицу на сервере A, запрос на сервере B покажет новую запись. Все идет нормально.
Пока у меня есть только одна таблица "Шаблоны":
Id PK (вычисляемое поле)
NodeId int default 1/2 (Сервер A = 1, Сервер B = 2)
LocalId int autoid
Имя Нварчар (100)
Теперь я хотел бы включить "Обнаружение конфликтов", которое должно быть включено по умолчанию. Но каждый раз, когда я пытаюсь сохранить функцию "Обнаружение конфликта" в свойствах публикации, я получаю следующую ошибку:
Невозможно сохранить свойства обнаружения конфликтов с пирами.
Возникла исключительная ситуация при выполнении оператора или пакета Transact-SQL.(Microsoft.SqlServer.ConnectionInfo)
Расположение программы:
в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executeType)
в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand)
в Microsoft.SqlServer.Replication.ReplicationObject.ExecCommand(String commandIn)
в Microsoft.SqlServer.Replication.TransPublication.SetPeerConflictDetection(Boolean enablePeerConflictDetection, Int32 peerOriginatorID)
в Microsoft.SqlServer.Management.UI.PubPropSubscriptionOptions.SaveP2PConflictDetection()
в Microsoft.SqlServer.Management.UI.PubPropSubscriptionOptions.SaveProperties(ExecutionMode& executeResult)Имя столбца 'Id' не существует в целевой таблице или представлении.
Изменен контекст базы данных на "TestDB". (Поставщик данных.Net SqlClient)Для получения справки нажмите: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.00.2531&EvtSrc=MSSQLServer&EvtID=1911&LinkId=20476
Имя сервера: SERVER_A
Номер ошибки: 1911
Серьезность: 16
Состояние: 1
Номер строки: 2Расположение программы:
в System.Data.SqlClient.SqlConnection.OnError(исключение SqlException, логическое breakConnection)
в System.Data.SqlClient.SqlInternalConnection.OnError(исключение SqlException, логическое breakConnection)
в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
в System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
в System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, логический асинхронный)
в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(результат DbAsyncResult, String methodName, логическое sendToPipe)
в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executeType)
Теперь я погуглил эту ошибку, и ничего не появляется. Я также не могу выяснить, какова точная целевая таблица ошибки "Имя столбца 'Id' не существует...".
Кто-нибудь сделал это успешно? Я что-то пропустил? Наличие этой настройки без обнаружения конфликта кажется довольно бесполезным...
РЕДАКТИРОВАТЬ
Итак, после некоторого исследования и настройки с различными базами данных и т. Д. Я обнаружил, что виновным является вычисленный столбец "Id" таблицы "Шаблоны". Я не знаю почему, но репликация не позволяет вычислять столбцы (которые также являются первичным ключом). Теперь он работает и без столбца "Id" и с использованием NodeId и LocalId в качестве объединенного PK.
Теперь возникает вопрос: почему нельзя использовать вычисляемый столбец в качестве PK для репликации с обнаружением конфликтов?