2015-12-29 4 views
0

Я следующий примера сценария и я искал способ, как сделать правильное обновление в базе данных в Sql Server, Project.SSDT Обновления данных при обновлении схемы

У меня есть 4 таблицы:

  • CarColors
    • Id
    • ColorCode
  • Автомобили
    • Id
    • CarColor_Id
  • Грузовики
    • Id
    • TruckColor_Id
  • TruckColors
    • Id
    • ColorCode

TruckColors и CarColors идентичны, поэтому я хочу реорганизовать это.

Нужные изменения:

  • Переименуйте CarColors в ColorCodes
  • Переименовать Cars.CarColor_Id в Cars.ColorCode_Id
  • Создать Trucks.ColorCode_Id внешний ключ к ColorCodes
  • Заливка 'Trucks.ColorCode_Id' на основе информации Trucks.TruckColor_Id
  • Удалить Trucks.TruckColor_Id колонку
  • Удалить TruckColors стол

я могу сделать только PostDeploy или PreDeploy но это либо:

  • Досрочно, потому что перед переносом Trucks.ColorCode_Id не существует.
  • до конца, потому что Trucks.TruckColor_Id уже удален

Таким образом, в середине обновления, я хочу, чтобы запустить этот конкретный сценарий:

UPDATE truck 
SET truck.ColorCode_Id = newcolor.Id 
FROM Trucks truck 
INNER JOIN TruckColors truckcolor ON truck.TruckColor_Id = truckcolor.Id 
INNER JOIN ColorCodes newcolor ON truckcolor.ColorCode = newcolor.ColorCode 

данных уже в производстве, так не должно происходить не dataloss. Как я могу достичь этого с помощью Проекты базы данных сервера Sql?

+0

Какой из этих шагов вы застряли на? Я не понимаю, каков ваш точный вопрос. –

ответ

1

Хитрость заключается в том, чтобы использовать как предварительный разворачивать и пост-Deploy, чтобы завершить изменение для вас:

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

Происходит миграция таблиц, а затем в вашем сценарии развертывания post вы обновляете свои таблицы данными промежуточной таблицы temp.

Затем развернуть удалите промежуточную таблицу темпа.

Это делает вещи проще, если вы сделаете ваши сценарии повторно запускаемыми так:

  • В предварительной проверке развертывания для старой таблицы и, если она существует, скопировать в промежуточную таблицу -В поста Deploy использовать внешний присоединяться, чтобы вставлять отсутствующие строки (или слить и т. д.)

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

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

Надеется, что это имеет смысл - я написал шаги здесь, которые могли бы сделать его более четкий (https://the.agilesql.club/blog/Ed-Elliott/2015-12-30/Migrating-Data-In-SSDT-Without-Losing-It)

Ed

Смежные вопросы