Как создать сценарий SQL для обновления существующей базы данных и сохранения ее данных - PullRequest
1 голос
/ 22 октября 2010

У меня есть база данных SQL Server 2008 (назовите ее productionDB), которая содержит данные и будет использоваться в производственной среде.

У меня есть другая база данных SQL Server 2008 (назовите ее stagingDB), которая используется в промежуточной среде.

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

До этого момента каждый раз, когда я вносил изменения в stagingDB, я генерировал сценарии (с помощью мастера сценариев SQL Server), которые удаляют / создают всю схему. Поэтому, когда я запускал сценарии на productionDB, он успешно обновлялся до обновленной схемы, но все данные, которые имелись в productionDB, были бы потеряны - что было хорошо, вплоть до настоящего времени.

В дальнейшем я хотел бы создать сценарии, которые будут хранить существующие данные в productionDB, а также обновлять их схему.

Я не могу найти параметр (и) в мастере сценариев SQL Server, который будет выполнять то, что я описываю.

Может ли мастер сценариев SQL Server выполнять то, что мне нужно? Если да, то как?

Ответы [ 3 ]

5 голосов
/ 22 октября 2010

Бросить / воссоздать - широкий меч;Вы должны быть более хирургическим.Вот несколько примеров псевдокода:

Добавление нового столбца:

if not exists (select your column from syscolumns)
   alter yourTable add
      yourColumn (type) NULL

Если он не может быть обнуляем, установите значение по умолчанию или обновите столбец для заполнения данных, затем измените таблицу иустановите для столбца значение NOT NULL.

Переименование столбца:

if not exists (select your column from syscolumns)
begin
   alter yourTable add yourColumn <type> NULL

   update yourTable set yourColumn = oldColumn

   alter yourTable drop oldColumn
end

Переименование таблицы:

if not exists (select your table from sysobjects)
begin
   create yourTable
       <your columns here>

   insert into yourTable ( <columns> ) select ( <columns> ) from oldTable

   delete from oldTable
   drop table oldTable
end

Обратите внимание на общую тему;Во-первых, вы должны проверить, выполнили ли вы это обновление, проверив наличие обновленных элементов схемы.Затем добавьте или удалите только то, что необходимо, в порядке добавления схемы-> перенос данных-> удаление схемы.Это немного больше работы для кода, но он будет работать быстрее и сохранить ваши данные.

2 голосов
/ 22 октября 2010

Я не знаю, каким образом в SQL Server можно автоматически делать то, что вы хотите, но вы можете найти коммерческие приложения (например, поставляемые такими компаниями, как RedGate), которые делают то, что вы хотите, но это очень сложнопредмет и всегда будут сценарии, которые не могут быть реально управляемы.Я всегда находил лучший сценарий для сценариев ваших модификаций в Staging таким образом, чтобы их можно было повторно запускать в режиме реального времени.Таким образом, вы пишете сценарии для изменения структуры таблицы - таким образом вы поддерживаете как промежуточные, так и оперативные данные при запуске сценариев.

1 голос
/ 22 октября 2010

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

Таким образом, он не знает, какие различия применить, например: когдаиспользовать alter table или когда использовать create table.

Да, скрипт может добавить предложение If Not Exist, но он также не знает, что делать, когда ваша таблица существует, но нуждается в дополнительном 2колонны.Мастер сценариев SQL Server не выполняет сравнение с другой схемой, он просто создает сценарии существующей схемы как есть.

В зависимости от вашей версии SQL2008 может быть установлена ​​версия BIDS вместе с SQL.В меню «Пуск» у вас должна быть папка «Microsoft SQL Server 2008», в которой есть ссылка на «Студия разработки бизнес-аналитики SQL Server» (BIDS).

Опять же, это будет зависеть от версииSQLServer2008.BIDS - это среда разработки Visual Studio.

Теперь, если она у вас есть, в зависимости от того, какая у вас версия BIDS (я думаю, что minnimum для инструмента сравнения схем - VS2008 SP1), вы можете создавать там проекты для сравнения 2схемы базы данных.Затем разницу можно записать в соответствующий скрипт.Я не знаю, как это сделать в VS2008, поскольку мы используем VS2010 с выпуском, который полностью реализован.Я посмотрел на VS2008, но не смог найти его в очевидном месте.Согласно Google, хотя в VS2008 SP1 есть инструмент сравнения схем.

Если ничего не помогает, вам придется искать бесплатный или платный инструмент сравнения схем, такой как SQL Compare 8.2 .

Идея та же, вы должны сравнить 2 схемы друг с другом, чтобы увидеть, что отличается.Затем решите, что вы хотите протолкнуть от постановки к Live, и составьте соответствующий сценарий.Инструменты просто выполняют большую часть ручной работы за вас.

...