Изменение ограничения столбца ноль / не ноль = ошибка репликации в строке - PullRequest
7 голосов
/ 16 декабря 2009

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 16 декабря 2009

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

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL 
3 голосов
/ 16 декабря 2009

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

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

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

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

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

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