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

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

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

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

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


person Dale    schedule 16.12.2009    source источник


Ответы (2)


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

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL 
person Dale    schedule 16.12.2009

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

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

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

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

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

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