Предположим, в Visual Studio у вас есть проект базы данных SQL 2008 и вы добавляете в таблицу столбец, не допускающий значения NULL. Когда вы перейдете к развертыванию базы данных сейчас, если в этой таблице есть данные, произойдет сбой. (Верно?) Как бы вы написали собственную логику, чтобы во время обновления вы могли установить для этого столбца значение «x» или использовать более сложный запрос или курсор для обновления всей таблицы и заполнения нового столбца? Это то, что вы хотели бы сделать только один раз - в то же время, когда столбец был добавлен в базу данных. Есть ли поддержка для этого?
Проект базы данных SQL Server 2008 Visual Studio 2010 - пользовательские обновления
Ответы (5)
Я бы добавил столбец, допускающий значение NULL, запустил команду UPDATE, чтобы заполнить его, и изменил столбец на NOT NULL. Хотя я использую Visual Studio 2010, я не использую его для развертывания. Вместо этого я развертываю с помощью SQL Compare - он генерирует сценарий SQL, который легко настроить.
Вот как я это делаю.
В Schema Viewer откройте скрипт создания таблицы и добавьте новые столбцы следующим образом:
[first_name] varchar( 32 ) NOT NULL default ' ',
[last_name] varchar( 32 ) NOT NULL default ' ',
Поскольку у них есть * значение по умолчанию *, они могут успешно развернуться.
Затем в моем сценарии после установки я проверяю значения '' в таблице и запускаю обновление, чтобы заполнить их, если это так. В качестве альтернативы код может исправить это.
Я провел много исследований по это тип темы, и, к сожалению, это та область, в которой отсутствуют проекты VSDB. Хорошее место для начала поиска - руководство Visual Studio ALM Rangers по проектам VSDB; у них есть практическая лаборатория, в которой подробно описываются рекомендуемые ими лучшие практики для выполнения именно того, о чем вы просите (это включает использование сценариев до и после развертывания для копирования данных в временные таблицы и из них). Кроме того, в блоге Barclay Hill есть статья, относящаяся к вашему вопросу (он старший программный менеджер Data Tools), которая совпадает с руководством.
Мне кажется, что этот рекомендуемый метод требует очень высоких затрат на обслуживание, если вам нужно иметь возможность обновлять несколько разных версий целевой базы данных, но если у вас есть только одна база данных (или одна версия схемы) для обновления, это довольно неплохо. работоспособный.
Вот что я в итоге сделал.
- Добавьте информацию о версии в базу данных (например, в таблицу SystemSettings).
- Создайте сценарий для следующей версии (например, 1.1.0.0.sql).
- В файле 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.