MSSQL_ENG002601
Сведения о сообщении
Название продукта |
SQL Server |
Версия продукта |
10.50 |
Номер построения продукта |
|
Идентификатор события |
2601 |
Источник события |
MSSQLSERVER |
Компонент |
SQL Server Database Engine |
Символическое имя |
Н/Д |
Текст сообщения |
Невозможно вставить повторяющуюся строку ключей в объект '%.*ls' с уникальным индексом '%.*ls'. |
Объяснение
Это общая ошибка, которая может возникать независимо от того, реплицируется база данных или нет. В реплицируемых базах данных эта ошибка возникает, как правило, по причине неправильного управления первичными ключами в топологии. В распределенной среде необходимо убедиться в том, что одно и тоже значение не вставлено в столбец первичного ключа или в любой другой уникальный столбец на нескольких узлах. Возможные причины ошибки:
Вставки в строку и обновления строки выполняются более чем в одном узле. И репликация слиянием, и обновляемые подписки для репликации транзакций обеспечивают обнаружение и разрешение конфликта, однако по-прежнему рекомендуется вставлять или обновлять строку только в одном узле. Одноранговые транзакции не обеспечивают обнаружение и разрешение конфликтов. Требуется, чтобы операции вставки и обновления были секционированы.
Строка вставлена на подписчике, который доступен только для чтения. Подписчики на публикации моментальных снимков должны быть доступны только для чтения, так же как и подписчики на публикации транзакций, если только не используются обновляемые подписки или одноранговые репликации транзакций.
Используется таблица со столбцом идентификаторов, однако управление столбцом осуществляется неверно.
В публикации слиянием эта ошибка также может возникнуть во время вставки в системную таблицу MSmerge_contents. Возникающая ошибка подобна следующей: Невозможно вставить повторяющуюся строку ключей в объект 'MSmerge_contents' с уникальным индексом 'ucl1SycContents'.
Действия пользователя
Действие по устранению проблемы зависит от причины, по которой она возникла:
Вставки или обновления строки выполняются более чем в одном узле.
Независимо от типа используемой репликации рекомендуется секционировать вставки и обновления везде, где это возможно, так как это уменьшит обработку данных, необходимую для обнаружения и разрешения конфликта. Секционирование вставок и обновлений является необходимым условием при использовании одноранговой репликации транзакций. Дополнительные сведения см. в разделе Одноранговая репликация транзакций.
Строка была вставлена на подписчике, который должен быть доступен только для чтения.
Не выполняйте вставку или обновление строк на подписчике, если не используется репликация слиянием, репликация транзакций с обновляемыми подписками или одноранговая репликация транзакций.
Используется таблица со столбцом идентификаторов, однако управление столбцом осуществляется неверно.
При использовании репликации слиянием или репликации с обновляемыми подписками столбцы идентификаторов должны автоматически управляться репликацией. При использовании одноранговой репликации транзакций управление этими столбцами должно выполняться вручную. Дополнительные сведения см. в разделе Репликация столбцов идентификаторов.
Ошибка возникает во время вставки в системную таблицу MSmerge_contents.
Эта ошибка может возникнуть вследствие неверного значения свойства join_unique_key фильтра соединения. Это свойство должно быть установлено равным TRUE, только если соединенный столбец в родительской таблице является уникальным. Если это свойство установлено равным TRUE, но столбец не является уникальным, возникает эта ошибка. Дополнительные сведения об установке данного свойства см. в разделах Как определить и изменить фильтр соединения между статьями публикации слиянием (среда SQL Server Management Studio) и Как определить и изменить фильтр соединения между статьями публикации слиянием (программирование репликации на языке Transact-SQL).