Изменение ограничения столбца null/not null = ошибка репликации rowguid

У меня есть база данных под управлением Sql Server 2005 с репликации слиянием. Я хочу изменить некоторые столбцы FK на "не нулевые", так как они всегда должны иметь значение. SQL-сервер не позволит мне сделать это, вот что он говорит:

  • Невозможно изменить таблицу. Недопустимо отбрасывать ограничение по умолчанию для столбца rowguid, используемого репликацией слиянием. Не удалось изменить схему во время выполнения внутренней процедуры репликации. Для корректирующих действий см. Другие сообщения об ошибках, которые сопровождают это сообщение об ошибке. Транзакция завершилась в триггере. Пакет был прерван.

Я вообще не пытаюсь изменить ограничения для столбца rowguid, только для другого столбца, который действует как FK. Другие столбцы, которые я хочу установить, не будут нулевыми, потому что запись не имеет никакого смысла без этой информации (т. Е. О клиенте, имени клиента).

Вопросы: есть ли способ обновить столбцы, чтобы они не были нулевыми, не выключая репликацию и не включая ее снова? Это даже лучший способ сделать это - я должен вместо этого использовать ограничение?

2 ответа

Решение

Очевидно, SSMS вносит изменения в таблицы, удаляя их и создавая заново. Так что просто нужно внести изменения с помощью оператора T-SQL.

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL 

Вам необходимо записать изменения в операторах T-SQL, поскольку SQL Server Management Studio будет пытаться удалить и заново создать таблицу, а не просто добавить дополнительный столбец.

Вам также нужно будет добавить новый столбец в ваши публикации.

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

Практика, улучшенный подход к производительности.......

Для выполнения этого упражнения вам необходимо:

  1. Сделайте резервную копию вашей среды репликации, написав всю конфигурацию.
  2. Удалить таблицу из репликации на обоих издателей / подписчиков
  3. Добавьте столбец на каждого издателя / подписчика.
  4. Примените обновление локально на каждом издателе / ​​подписчике.
  5. Добавьте таблицу обратно в репликацию.
  6. Проверьте, что транзакции реплицируются.
Другие вопросы по тегам