Как правильно управлять развертыванием базы данных с помощью проектов баз данных SSDT и Visual Studio 2012?
Я нахожусь на стадии исследования, пытаясь принять проекты баз данных 2012 года на существующем небольшом проекте. Я разработчик C#, а не DBA, поэтому я не особенно хорошо разбираюсь в лучших практиках. Я искал google и stackoverflow в течение нескольких часов, но я все еще не знаю, как правильно обрабатывать некоторые ключевые сценарии развертывания.
1) в течение нескольких циклов разработки, как я могу управлять несколькими версиями моей базы данных? Если у меня есть клиент на v3 моей базы данных и я хотите обновить их до v8, как мне это сделать? В настоящее время мы управляем созданными вручную схемами и сценариями переноса данных для каждой версии нашего продукта. Нам все еще нужно делать это отдельно или есть что-то в новой парадигме, которая поддерживает или заменяет это?
2) Если схема изменяется таким образом, что требуется перемещение данных, каков наилучший способ справиться с этим? Я предполагаю, что некоторая работа идет в сценарии перед развертыванием, чтобы сохранить данные, а затем после развертывания сценарий ставит его обратно в нужное место. Так ли это или есть что-то лучше?
3) любые другие советы или рекомендации о том, как лучше работать с этими новыми технологиями тоже весьма приветствуется!
обновление: мое понимание проблемы немного выросло с тех пор, как я изначально задал этот вопрос, и хотя я придумал работоспособное решение, это было не совсем то решение, на которое я надеялся. Вот переформулировка моей проблемы:
в проблема, с которой я сталкиваюсь, связана исключительно с данными. Если у меня есть клиент в версии 1 моего приложения, и я хочу обновить их до версии 5 моего приложения, у меня не будет проблем с этим, если в их базе данных нет данных. Я бы просто позволил SSDT интеллектуально сравнивать схемы и переносить базу данных одним выстрелом. К сожалению, клиенты имеют данные, так что это не так просто. Схема изменяется с версии 1 моего приложения до версии 2 до версии 3 (и т. д.) Все данные воздействия. Моя текущая стратегия управления данными требуется, чтобы я поддерживал скрипт для каждого обновления версии (от 1 до 2, от 2 до 3 и т. д.). Это мешает мне перейти прямо из версии 1 моего приложения в версию 5, потому что у меня нет сценария миграции данных, чтобы идти прямо туда. Перспектива создания пользовательских сценариев обновления для каждого клиента или управления сценариями обновления для перехода от каждой версии к каждой большей версии экспоненциально неуправляема. Я надеялся, что существует какая-то стратегия SSDT, которая позволяет управлять стороной данных из вещей проще, может быть, даже так же легко, как схема сторона вещей. Мой недавний опыт работы с SSDT не дал мне никакой надежды на существование такой стратегии, но я хотел бы узнать по-другому.
4 ответов:
Я работал над этим сам, и я могу сказать вам, что это не так просто.
во - первых, чтобы обратиться к ответу JT-вы не можете отклонить "версии", даже с декларативной механикой обновления, которую имеет SSDT. SSDT выполняет "довольно приличную" работу (при условии, что вы знаете все переключатели и gotchas) перемещения любой исходной схемы в любую целевую схему, и это правда, что это не требует проверки как таковой, но он понятия не имеет, как управлять "движением данных" (по крайней мере, я не вижу!). Так что, просто как dbproj-файл, вас оставляют вашим собственным устройствам в пре-и пост-скрипты. Поскольку сценарии движения данных зависят от известного начального и конечного состояния схемы, нельзя избежать управления версиями БД. Поэтому сценарии движения данных должны применяться к версионному снимку схемы, что означает, что вы не можете произвольно обновлять БД с v1 до v8 и ожидать, что сценарии движения данных v2 до v8 будут работать (предположительно, вам не понадобится сценарий движения данных v1).
к сожалению, я не вижу никакого механизма в SSDT публикация, которая позволяет мне обрабатывать этот сценарий интегрированным образом. Это означает, что вам придется добавить свой собственный scafolding.
первый трюк заключается в отслеживании версий в базе данных (и проекте SSDT). Я начал использовать трюк в DBProj и перенес его в SSDT, и после проведения некоторых исследований оказалось, что другие тоже используют это. Вы можете применить расширенное свойство DB к самой базе данных (назовите его "BuildVersion" или "AppVersion" или что-то в этом роде) и применить значение версии к нему. Затем вы можете захватить это расширенное свойство в самом проекте SSDT, и SSDT добавит его в качестве сценария (затем вы можете проверить параметр публикации, который включает расширенные свойства). Затем я использую переменные SQLCMD для идентификации исходной и целевой версий, применяемых в текущем проходе. После определения разности версий между источником (моментальный снимок проекта) и целью (целевая БД, которая будет обновляться) можно найти все моментальные снимки, которые необходимо применить. К сожалению, это это сложно сделать из внутри развертывание SSDT, и вам, вероятно, придется переместить его в конвейер сборки или развертывания (мы используем автоматические развертывания TFS и имеем для этого пользовательские действия).
следующим препятствием является сохранение снимков схемы с соответствующими сценариями движения данных. В этом случае это помогает сделать скрипты как можно более идемпотентными (то есть вы можете перезапустить скрипты без каких-либо побочных эффектов). Это помогает разделить скрипты, которые могут безопасно быть перезапущен из сценариев, которые должны быть выполнены только один раз. Мы делаем то же самое со статическими справочными данными (словарь или таблицы поиска) - другими словами, у нас есть библиотека сценариев слияния (по одному на таблицу), которые поддерживают синхронизацию ссылочных данных, и эти сценарии включены в сценарии после развертывания (с помощью команды SQLCMD :r). Важно отметить, что вы должны выполните их в правильном порядке, если любая из этих справочных таблиц имеет ссылки FK друг другу. Мы включаем их в основной сценарий после развертывания по порядку, и это помогает нам создать инструмент, который генерирует эти сценарии для нас - он также разрешает порядок зависимостей. Мы запускаем этот инструмент генерации в конце "версии", чтобы захватить текущее состояние статических справочных данных. Все ваши другие сценарии движения данных в основном будут специальными и, скорее всего, будут только одноразовыми. В этом случае, вы можете сделать одну из двух вещей: вы можете использовать оператор if, против дБ сборка / версия приложения, или вы можете уничтожить сценарии 1 раз после создания каждого пакета моментальных снимков.
Это помогает помнить, что SSDT отключит ограничения проверки FK и только повторно включит их после запуска сценариев после развертывания. Это дает вам возможность заполнить новые ненулевые поля, например (кстати, вы должны включить опцию для создания временных "умных" значений по умолчанию для ненулевых столбцов, чтобы сделать эту работу). Однако ограничения проверки FK отключены только для таблиц, которые SSDT воссоздается из-за изменения схемы. В других случаях вы несете ответственность за то, чтобы сценарии движения данных выполнялись в правильном порядке, чтобы избежать жалоб на ограничения проверки (или вы вручную отключили/повторно включили их в своих сценариях).
DACPAC может помочь вам, потому что DACPAC по существу является моментальным снимком. Он будет содержать несколько XML-файлов, описывающих схему (аналогично выходу сборки проекта), но замороженных во времени на момент ее создания. Затем вы можете использовать SQLPACKAGE.EXE или поставщик развертывания для публикации этого снимка пакета. Я не совсем понял, как использовать dacpac versioning, потому что он больше привязан к "зарегистрированным" приложениям данных, поэтому мы застряли с нашей собственной схемой управления версиями, но мы помещаем нашу собственную информацию о версии в имя файла DACPAC.
Я хотел бы иметь более убедительный и выдыхающий пример, чтобы обеспечить, но мы все еще работаем над проблемами здесь тоже.
одна вещь, которая действительно отстой о SSDT является то, что в отличие от DBProj, в настоящее время он не расширяется. Хотя он делает гораздо лучшую работу, чем DBProj во многих разных вещах, вы не можете переопределить его поведение по умолчанию, если вы не можете найти какой-либо метод внутри сценариев pre/post для обхода проблемы. Одна из проблем, которую мы пытаемся решить прямо сейчас, заключается в том, что метод по умолчанию для воссоздания таблицы обновлений (CCDR) действительно воняет, когда у вас есть десятки миллионов записей.
-UPDATE: я не видел этот пост в течение некоторого времени, но по-видимому, он был активен в последнее время, поэтому я подумал, что добавлю пару важных заметок: если вы используете VS2012, выпуск SSDT в июне 2013 года теперь имеет встроенный инструмент сравнения данных, а также предоставляет точки расширения-то есть теперь вы можете включать участников сборки и модификаторы плана развертывания для проекта.
Я действительно не нашел больше полезной информации по этому вопросу, но я потратил некоторое время, чтобы узнать инструменты, возиться и играть, и я думаю, что я придумал некоторые приемлемые ответы на мой вопрос. Это не обязательно лучшие ответы. Я все еще не знаю, есть ли другие механизмы или лучшие практики для лучшей поддержки этих сценариев, но вот что я придумал:
сценарии до и после развертывания для данной версии базы данных являются только используется миграция данных из предыдущей версии. В начале каждого цикла разработки скрипты очищаются, и по мере развития они наполняются всем необходимым sql для безопасного переноса данных из предыдущей версии в новую. Единственным исключением здесь являются статические данные в базе данных. Эти данные известны во время разработки и постоянно присутствуют в сценариях после развертывания в виде инструкций слияния T-SQL. Это помогает сделать возможным развертывание любой версии база данных в новую среду только с последним скриптом публикации. В конце каждого цикла разработки, публикации сценария из предыдущей версии в новую. Этот сценарий будет включать сгенерированный sql для переноса схемы и сценарии развертывания ручной работы. Да, я знаю, что инструмент публикации можно использовать непосредственно против базы данных, но это не очень хороший вариант для наших клиентов. Я также знаю о файлах dacpac, но я не совсем уверен, как их использовать. Сгенерированный скрипт публикации кажется, это лучший вариант, который я знаю для обновления производства.
Итак, чтобы ответить на мои сценарии:
1) чтобы обновить базу данных с v3 до v8, мне нужно будет выполнить сгенерированный скрипт публикации для v4, затем для v5, затем для v6 и т. д. Это очень похоже на то, как мы делаем это сейчас. Это хорошо понятно, и проекты баз данных, похоже, делают создание/поддержание этих сценариев намного проще.
2) Когда схема изменяется из - под данных, сценарии до и после развертывания используются для переноса данных туда, где он должен идти для новой версии. Затронутые данные по существу копируются в сценарии перед развертыванием и возвращаются на место в сценарии после развертывания.
3) я все еще ищу советы о том, как лучше работать с этими инструментами в этих сценариях и другие. Если я что-то не так здесь, или если есть какие-либо другие gotchas я должен быть в курсе, пожалуйста, дайте мне знать! Спасибо!
в моем опыте использования SSDT понятие номеров версий (т. е. v1, v2...vX и др...) для баз данных вроде как уходит. Это связано с тем, что SSDT предлагает парадигму разработки, известную как декларативная разработка базы данных, которая свободно означает, что вы сообщаете SSDT, в каком состоянии вы хотите, чтобы ваша схема была, а затем позволяете SSDT взять на себя ответственность за ее ввод в это состояние, сравнивая с тем, что у вас уже есть. В этой парадигме понятие развертывания v4, затем v5 и т. д.... идет прочь.
ваши сценарии до и после развертывания, как вы правильно заявляете, существуют для целей управления данными.
надеюсь, что это поможет.
JT
Я просто хотел сказать, что эта тема до сих пор была отличной.
Я боролся с точно такими же проблемами и пытаюсь решить эту проблему в нашей организации, на довольно большом устаревшем приложении. Мы начали процесс перехода к SSDT (в ветке TFS), но находимся в точке, где нам действительно нужно понять процесс развертывания и управлять пользовательскими миграциями и ссылочными/поисковыми данными по пути.
усложнять кроме того, наше приложение является одной кодовой базой, но может быть настроено для каждого "клиента", поэтому у нас есть около 190 баз данных, с которыми мы имеем дело, для этого одного проекта, а не только 3 или около того, что, вероятно, нормально. Мы делаем развертывание и настройка новых клиентов достаточно часто. Теперь мы в значительной степени полагаемся на PowerShell с помощью сценариев инкрементного выпуска старой школы (и связанных сценариев для создания нового клиента в этой версии). Я планирую внести свой вклад, как только мы все это выясним, но, пожалуйста, поделитесь всем еще ты научился. Я верю, что мы в конечном итоге будем поддерживать пользовательские сценарии выпуска для каждой версии, но мы увидим. Идея о поддержании каждого скрипта в проекте и включении переменной From и To SqlCmd очень интересна. Если бы мы это сделали, мы, вероятно, обрезали бы по пути, физически удалив действительно старые сценарии обновления, как только все прошли эту версию.
кстати-боковое примечание-на тему минимизации отходов мы также просто потратили кучу времени на выяснение как автоматизировать применение соответствующих соглашений об именах/типах данных для столбцов, а также автоматическое создание для всех первичных и внешних ключей на основе соглашений об именах, а также ограничений индекса и проверки и т. д. Самое сложное было иметь дело с "девиантами", которые не следовали правилам. Может быть, я тоже поделюсь этим однажды, если кто-то заинтересован, но сейчас мне нужно серьезно заняться этой историей развертывания, миграции и ссылочных данных. Спасибо снова. Как будто вы были говоря именно то, что было у меня в голове и искал этим утром.
Comments