Не удается вставить в реплицированную таблицу - проверка диапазона идентификаторов - PullRequest
17 голосов
/ 02 февраля 2010

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

Msg 548, Level 16, State 2, Line 1
The insert failed. It conflicted with an identity range check constraint in database 'XXX', replicated table 'dbo.NODE_ATTRIB_RSLT', column 'ID'. If the identity column is automatically managed by replication, update the range as follows: for the Publisher, execute sp_adjustpublisheridentityrange; for the Subscriber, run the Distribution Agent or the Merge Agent.
The statement has been terminated.

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

Вот как я пытаюсь вставить данные:

insert into NODE_ATTRIB_RSLT 
([NODE_ID]
      ,[ATTRIB_ID]
      ,[STATE_ID]
      ,[PLAN_REVISION_ID]
      ,[TIMESTAMP]
      ,[VALUE]
      ,[VALUE_TEXT]
      ,[LAST_MODIFIED]) 
SELECT [NODE_ID]
          ,[ATTRIB_ID]
          ,[STATE_ID]
          ,[PLAN_REVISION_ID]
          ,[TIMESTAMP]
          ,[VALUE]
          ,[VALUE_TEXT]
          ,[LAST_MODIFIED]   FROM [NODE_ATTRIB_RSLT_TEMP]

Столбец PK - это автоматически сгенерированный идентификатор, называемый ID. Чтобы попытаться вставить меньше строк за раз, я добавил предложение WHERE в конец выбора следующим образом:

WHERE ID >= 1000 and ID <1100

но безрезультатно.

Запуск sp_adjustpublisheridentityrange на издателе выполняется успешно, но безрезультатно.

Как я могу исправить эту проблему со вставками? Как изменить диапазоны ограничений диапазона идентификаторов до более приемлемого уровня, оставив репликацию запущенной?

Ответы [ 2 ]

23 голосов
/ 03 февраля 2010

Кажется, я понял, в чем проблема.

Если посмотреть на свойства реплицированной таблицы, то у нее был стандартный диапазон идентификаторов по умолчанию: 10000 для издателя и 1000 для подписчика.

Однако проверка ограничения идентификаторов на фактической таблице (используя SP_HELPCONSTRAINT 'node_attrib_rslt') показала, что на обоих серверах был только пул из 1000 идентификаторов. Это привело к сбою массовой вставки, даже когда я ограничил число строк для вставки - я полагаю, что SQL Server даже не заходит так далеко, когда проверяет ограничение при выполнении INSERT INTO.

Чтобы исправить это, мне пришлось сделать несколько вещей:

Изменить диапазон идентификаторов таблицы. Я установил его до 20K для издателя и подписчика.

  1. На издателе разверните Репликация -> Локальные публикации
  2. Щелкните правой кнопкой мыши конкретную подписку и выберите Свойства.
  3. Выберите страницу статей.
  4. Выделите соответствующую таблицу.
  5. Нажмите кнопку «Свойства товара» и выберите «Установить свойства выделенного товара таблицы».
  6. В окне свойств статьи найдите параметры управления диапазоном идентификаторов.
  7. Измените соответствующие значения.
  8. Нажмите OK и OK в диалоговых окнах.

Запустите хранимый процесс sp_adjustpublisheridentityrange на издателе.

  1. Новое окно запроса на сервере
  2. Выберите правильную базу данных
  3. Выполнить sp_adjustpublisheridentityrange @table_name = 'node_attrib_rslt'

От абонента принудительно синхронизировать серверы.

  1. На подписчике разверните Репликация -> Локальные подписки
  2. Щелкните правой кнопкой мыши конкретную подписку и выберите «Просмотр статуса подписки».
  3. В появившемся диалоговом окне нажмите кнопку монитора.
  4. В открывшемся окне «Монитор репликации» разверните конкретный издатель в левой панели.
  5. Нажмите на подписку для редактирования.
  6. В правой панели щелкните правой кнопкой мыши статус подписки и выберите Начать синхронизацию.
  7. Статус должен обновиться до «Синхронизация», пока он делает свое дело.
  8. После завершения нажмите на вкладку «Предупреждения и агенты». У меня был «Агент моментальных снимков», перечисленный в нижней панели. Щелкните правой кнопкой мыши на этом агенте и запустите его. Через некоторое время изменение свойств на сервере должно было быть перенесено на клиент.

Может быть: вставить несколько тестовых строк в таблицу.

Редактировать: Недавно мне пришлось снова выполнить эту задачу, и ограничение на таблицу не обновлялось, пока я не вставил в таблицу кучу фиктивных данных, чтобы исчерпать ограничение по умолчанию. Затем я повторно синхронизировал серверы, и ограничение было обновлено до нового значения.

После этого проверка ограничения идентификаторов показала, что у меня наконец-то появился диапазон идентификаторов 20 КБ для вставки как на издателя, так и на подписчика.

2 голосов
/ 15 октября 2014

У меня была точно такая же проблема, и вышеупомянутое решение ничего не сделало для меня. Вместо этого в конечном итоге проблема была решена путем установки новых, более широких диапазонов идентификаторов для таблиц в публикации и последующего удаления ограничений идентификаторов для таблицы. И, наконец, запустив эту команду, которая устанавливает текущий идентификатор.

DBCC CHECKIDENT ('TableName', RESEED, 1000000000);

Вместо установки значения 1000000000 ограничение создается снова и устанавливается на правильное значение диапазона идентификаторов, указанное в настоящий момент в таблице в публикации. Похоже, команда CHECKIDENT заставляет ограничение каким-то образом обновляться.

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

Я выполнил указанную выше команду как на издателе, так и на подписчике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...