Я настраиваю стратегию репликации SQL, используя MSSQL2008 с одноранговыми публикациями (2 сервера, каждый подписывается на другой).
Я следил за этим КАК из MSDN, и установка, похоже, работает нормально: добавьте запись в одну таблицу на сервере A, запрос на сервере B показывает новую запись. Все идет нормально.
Пока у меня только одна таблица "Шаблоны":
Мне бы ПК (расчетное поле)
NodeId int по умолчанию 1/2 (сервер A = 1, сервер B = 2)
LocalId int autoid
название nvarchar (100)
Теперь я хотел бы включить «Обнаружение конфликтов», которое должно быть включено по умолчанию. Но каждый раз, когда я пытаюсь сохранить функцию «Обнаружение конфликтов» в свойствах публикации, я получаю следующую ошибку:
Невозможно сохранить свойства обнаружения конфликта одноранговых узлов.
Исключение при выполнении инструкции или пакета Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
Расположение программы:
в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery (String sqlCommand, ExecutionTypes executionType)
в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery (String sqlCommand)
в Microsoft.SqlServer.Replication.ReplicationObject.ExecCommand (String commandIn)
в Microsoft.SqlServer.Replication.TransPublication.SetPeerConflictDetection (логическое значение enablePeerConflictDetection, Int32 peerOriginatorID)
в Microsoft.SqlServer.Management.UI.PubPropSubscriptionOptions.SaveP2PConflictDetection ()
в Microsoft.SqlServer.Management.UI.PubPropSubscriptionOptions.SaveProperties (ExecutionMode и executionResult)Столбец с именем «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, Boolean async)
в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (результат DbAsyncResult, String methodName, логическое значение sendToPipe)
в System.Data.SqlClient.SqlCommand.ExecuteNonQuery ()
в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery (String sqlCommand, ExecutionTypes executionType)
Теперь я погуглил, черт возьми, эту ошибку, и ничего не обнаружилось. Я также не могу узнать, какова точная целевая таблица ошибки «Имя столбца 'Id' не существует ...».
Кто-нибудь делал это успешно? Я что-то упускаю? Такая настройка без обнаружения конфликтов кажется довольно бесполезной ...
РЕДАКТИРОВАТЬ
Итак, после некоторого дополнительного исследования и настройки с разными базами данных и т. Д. Я обнаружил, что виновником является вычисленный столбец «Id» в таблице шаблонов. Я не знаю почему, но репликация, похоже, не позволяет вычислять столбцы (которые также являются первичным ключом). Он работает и сейчас, без столбца «Id» и с использованием NodeId и LocalId в качестве комбинированного PK.
Итак, теперь вопрос в том, почему нельзя иметь вычисляемый столбец в качестве PK для репликации с обнаружением конфликтов?