Проект базы данных SQL Server 2008 Visual Studio 2010 - пользовательские обновления

Предположим, в Visual Studio у вас есть проект базы данных SQL 2008 и вы добавляете в таблицу столбец, не допускающий значения NULL. Когда вы перейдете к развертыванию базы данных сейчас, если в этой таблице есть данные, произойдет сбой. (Верно?) Как бы вы написали собственную логику, чтобы во время обновления вы могли установить для этого столбца значение «x» или использовать более сложный запрос или курсор для обновления всей таблицы и заполнения нового столбца? Это то, что вы хотели бы сделать только один раз - в то же время, когда столбец был добавлен в базу данных. Есть ли поддержка для этого?


person Josh M.    schedule 02.11.2010    source источник


Ответы (5)


Я бы добавил столбец, допускающий значение NULL, запустил команду UPDATE, чтобы заполнить его, и изменил столбец на NOT NULL. Хотя я использую Visual Studio 2010, я не использую его для развертывания. Вместо этого я развертываю с помощью SQL Compare - он генерирует сценарий SQL, который легко настроить.

person A-K    schedule 03.11.2010
comment
Спасибо. Это то, что я делаю сейчас, но я не могу не думать, что должен быть более автоматизированный способ сделать это. - person Josh M.; 03.11.2010

Вот как я это делаю.

В Schema Viewer откройте скрипт создания таблицы и добавьте новые столбцы следующим образом:

[first_name]        varchar( 32 )   NOT NULL default ' ',
[last_name]         varchar( 32 )   NOT NULL default ' ',

Поскольку у них есть * значение по умолчанию *, они могут успешно развернуться.

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

person Simone Aiken    schedule 06.06.2012

Я провел много исследований по это тип темы, и, к сожалению, это та область, в которой отсутствуют проекты VSDB. Хорошее место для начала поиска - руководство Visual Studio ALM Rangers по проектам VSDB; у них есть практическая лаборатория, в которой подробно описываются рекомендуемые ими лучшие практики для выполнения именно того, о чем вы просите (это включает использование сценариев до и после развертывания для копирования данных в временные таблицы и из них). Кроме того, в блоге Barclay Hill есть статья, относящаяся к вашему вопросу (он старший программный менеджер Data Tools), которая совпадает с руководством.

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

person Jeremy Elbourn    schedule 03.11.2010

Вот что я в итоге сделал.

  1. Добавьте информацию о версии в базу данных (например, в таблицу SystemSettings).
  2. Создайте сценарий для следующей версии (например, 1.1.0.0.sql).
  3. В файле Scripts \ Post-Deployment \ Script.PostDeployment.sql добавьте следующее:

DECLARE @versionMajor INT;
DECLARE @versionMinor INT;
DECLARE @versionBuild INT;
DECLARE @versionRevision INT;

ВЫБРАТЬ ТОП 1
@versionMajor = VersionMajor,
@versionMinor = VersionMinor,
@versionBuild = VersionBuild,
@versionRevision = VersionRevision
FROM SystemSettings;

IF (@versionMajor ‹= 1 И @versionMinor ‹1)
BEGIN
: r" .. \ Upgrade \ 1.1.0.0.sql "
END

Это запустит сценарий 1.1.0.0, если версия базы данных ниже. Сценарий 1.1.0.0 обновляет номера версий базы данных в качестве последнего шага. В будущих обновлениях вам просто потребуется добавить еще один блок IF.

person Josh M.    schedule 03.11.2010
comment
Остерегайтесь этого решения. Скажите, что ваш 1.1.0.0.sql запрашивает TableX. Если в более поздней версии вы откажетесь от TableX, вам придется обновить этот скрипт. По мере роста количества версий у вас будет все больше и больше скриптов, которые нужно поддерживать в таких ситуациях. - person Jeremy Elbourn; 04.11.2010
comment
Скрипты обновления запускаются последовательно, так что это не должно быть проблемой, если я неправильно интерпретирую ваш комментарий. - person Josh M.; 03.03.2011

person    schedule
comment
Да, но прочтите, пожалуйста, мой вопрос. Я говорю об интеграции этого типа сценария в развертывание проекта базы данных SQL. - person Josh M.; 03.11.2010
comment
@Josh M: почему голосование против? вы не указали, с помощью какого инструмента развертываете, и существует множество способов развертывания помимо развертывания проекта базы данных SQL. - person A-K; 03.11.2010
comment
поэтому запустите этот оператор с помощью ant-сценария через sqlplus. - person Randy; 03.11.2010