Необходимо изменить типы столбцов в производственной базе данных (SQL Server 2005) - PullRequest
0 голосов
/ 16 марта 2011

Мне нужна помощь в написании сценария TSQL для изменения типа данных двух столбцов.

Мы меняем два столбца:

  • uniqueidentifier -> varchar (36) * * * имеетограничение первичного ключа
  • xml -> nvarchar (4000)

Моя основная задача заключается в развертывании сценария на рабочем месте ...

Таблица активно используетсяобщедоступный веб-сайт, который получает тысячи просмотров в час.Следовательно, нам нужно, чтобы скрипт выполнялся быстро, не влияя на обслуживание в клиентской части.Кроме того, мы должны иметь возможность автоматически откатывать транзакцию в случае возникновения ошибки.

К счастью, таблица содержит только около 25 строк, поэтому я предполагаю, что обновление будет быстрым.

Эта база данных - SQL Server 2005.

(К вашему сведению - изменения типа требуются из-за стороннего инструмента, несовместимого с типами SQL Server xml и uniqueidentifier. Мы ужепротестировал изменения в dev и функциональных проблем с изменениями нет.)

Ответы [ 3 ]

6 голосов
/ 16 марта 2011

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

  • Начать транзакцию
  • создать новую таблицу с финальной структура, которую вы хотите.
  • Скопируйте данные из исходной таблицы на новый стол
  • Переименуйте старую таблицу, например, в original_name_old
  • Переименуйте новую таблицу в original_table_name
  • Завершение транзакции

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

Если в таблице есть внешние ключи, сценарий будет немного сложнее, но все еще возможен без особой работы.

2 голосов
/ 16 марта 2011

Следовательно, нам нужно, чтобы скрипт выполнялся быстро, не влияя на обслуживание в клиентской части.

Это всего лишь мнение, но оно основано на опыте: это плохая идея.Лучше иметь короткие (заранее объявленные, если возможно) запланированные простои, чем рисковать.

Единственное исключение - если вам действительно все равно, повреждены ли данные в этих таблицах, и вы можете быть недоступны в течение длительного периода.

В этой ситуации, основанной на типах thизменений, которые вы вносите, и уже проведенного вами тестирования, похоже, что риск очень минимален, поскольку вы протестировали изменения и ДОЛЖНЫ быть в состоянии сделать это безопасно, но ничего не гарантировано.

Во-первых, вам нужно иметь запасной план на случай, если что-то пойдет не так.Краткая версия МИНИМАЛЬНОГО разумного плана будет включать:

  • Завершение работы сайта
  • Создание резервной копии базы данных
  • Запуск сценария
  • проверить целостность БД
  • вернуть сайт в режим онлайн

Было бы очень неразумно пытаться сделать такое обновление, пока веб-сайт работает.вы рискуете потерять работу в течение продолжительного периода времени, если что-то пойдет не так.

В ХОРОШЕМ плане вы также можете проверить это по копии базы данных и копии веб-сайта (среда тестирования / промежуточной проверки)сначала, а затем выполните действия, описанные выше, для обновления живого сервера. Вы уже сделали это.Престижность!

Существуют даже лучшие методы для создания такого обновления, но компромисс между временем простоя и безопасностью в большинстве случаев не составляет никакого труда.

1 голос
/ 16 марта 2011

И если вам абсолютно необходимо сделать это вживую, то вы можете рассмотреть это:

1) Создайте автономную версию таблицы с новыми типами данных и скопированными данными.2) Постройте все необходимые ключи и индексы для автономных таблиц.3) поменять таблицы в транзакции.00 Вы можете переименовать старую таблицу во что-то другое в качестве аварийного резервного копирования.

sp_help 'sp_rename'

Но ПРОВЕРЬТЕ все это в среде, похожей на продукт.И убедитесь, что ваши резервные копии обновлены.И делайте это, когда вы менее всего заняты.

...