Автоматическая генерация сценариев изменения базы данных - PullRequest
13 голосов
/ 12 февраля 2010

Я ищу способ автоматизировать создание сценариев изменений для наших баз данных.

В настоящее время мы используем редакцию базы данных Visual Studio 2008, которая имеет опцию Schema Compare, но я не вижу способа автоматизировать эти действия.

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

Кто-нибудь знает решение для этого или я собираюсь написать мили сценариев, чтобы это произошло?

Использование любых платных продуктов, кроме инструментов Microsoft, здесь не вариант ...

Обновление на основе отзывов:

  • У меня есть различные базы данных разных размеров, но все изменения будут происходить контролируемым образом, при этом я уже знаю, что данные уже есть.
  • Только "легкие" изменения должны решаться автоматически, я думаю, добавление столбцов и таблиц (очень часто). Столбцы никогда не могут быть удалены (поэтому инструмент / скрипт может протестовать, если это произойдет)

Ответы [ 8 ]

7 голосов
/ 17 февраля 2010

Подобно тому, что делает @Anton Gogolev, мы используем инструмент, который позволяет записывать миграции в файлы XML. Инструмент, который мы используем, называется Liquibase и поддерживает множество различных разновидностей СУБД. Мы не только используем его внутри наших схем разработчика, но и используем его снаружи во время установки обновления, которую выполняет клиент.

5 голосов
/ 23 сентября 2013

Надеюсь, я все еще могу помочь:

Вы должны быть в состоянии сделать это с помощью любого хорошего инструмента сравнения баз данных, который поддерживает интерфейс командной строки. В этом случае вам придется создать простой скрипт bat и добавить его в планировщик задач.

Я знаю, ApexSQL Diff поддерживает эту функцию, и я уверен, что SQL Compare от Red Gate имеет такую ​​же опцию в профессиональной версии.

3 голосов
/ 16 февраля 2010

Как упомянуто thijs , в Power Edition Power Tools содержится SqlSchemaCompareTask, который вы можете использовать из своего кода для создания сценария изменений:

SqlSchemaCompareTask task = new SqlSchemaCompareTask()
{
    SourceConnectionString = "Data Source=source-db; ...",
    SourceDatabaseName = "source-database-name",
    TargetConnectionString = "Data Source=target-db; ...",
    TargetDatabaseName = "target-database-name",
    OutputFileName = "changes.sql",
    OutputPath = @"C:\path\to\output"
};

task.Execute();

Кроме того, вы можете выполнить его с помощью скрипта сборки через msbuild.exe:

<Import
    Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v8.0\TeamData\
             Microsoft.VisualStudio.TeamSystem.Data.PowerTools.Tasks.targets"/>
<Target Name ="SchemaCompare">
    <SqlSchemaCompareTask
        SourceConnectionString="$(SourceConnectionString)"
        SourceDatabaseName="$(TargetDatabase)"
        TargetConnectionString="$(TargetConnectionString)"
        TargetDatabaseName="$(TargetDatabase)"
        OutputPath = "$(IntermediateOutputPath)"
        OutputFileName = "$(TargetDatabase)SchemaCompare.sql"
        IgnoreChecks ="true"/>
</Target>
2 голосов
/ 16 февраля 2010

Похоже, что SqlSchemaCompareTask в Microsoft® Visual Studio Team System 2008 Database Edition Power Tools. http://www.microsoft.com/downloads/details.aspx?FamilyID=73ba5038-8e37-4c8e-812b-db14ede2c354&displaylang=en

Это основано на первой версии Database Edition, а не на обновленной версии GDR2.

1 голос
/ 21 февраля 2010

Уже 10 лет я использую DbGhost для реализации управления изменениями sql в большинстве консультативных служб, в которых я принимал участие;неудивительно, что отсутствие управления изменениями SQL у конкурента, обеспечивающего код приложения.

Поддержка Innovartis ' не имеет себе равных в предоставлении помощи при реализации как непрерывного подхода к интеграции, так и поддержки.поддержка базы данных, а также процесс выпуска и пути обновления.Совсем недавно я применил его к проекту Monorail / nHibernate, над которым я работаю, который генерирует сценарии обновления из нашей модели домена POCO, которая определяет нашу базу данных.Они создаются и применяются с помощью нашей сборки CruiseControl при каждой регистрации.

Более конкретно для вашей ситуации вы можете указать DbGhost на версию выпуска (v1.0) вашей базы данных иСценарий вашего источника и статических данных.Это может быть введено в систему контроля версий.Это необязательные шаги, но разумная отправная точка.

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

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

Через 10 лет, когда я 'Обнаружив проблему с продуктом, сотрудники службы поддержки всегда вежливо указывают либо на ошибку в моем процессе, либо на одну из многих точек расширения в процессе, которые мне нужно использовать, чтобы обойти мою проблему.Это, конечно, обрабатывает сброс столбцов, индексов, данных, абсолютно все.Настройки позволяют автоматически выполнять только простые изменения и могут не срабатывать при предупреждениях или при удалении объектов (столбцов / таблиц), которые можно поддерживать в файлах настроек xml (у нас более симпатичные настройки в нашей сборке разработки и более строгие для живой сборки).

Я бы не стал разрабатывать Sql Server без него, и это коренным образом изменило мою разработку на SQL.

Если вам нужно больше подробностей о рекомендованном процессе или более предписывающих шагах, пожалуйста, сообщите мне.

1 голос
/ 16 февраля 2010

Можете ли вы быть более конкретным? Например, насколько велика база данных? Сколько у него данных? Как быстро должно быть обновление?

Я уверен, что не существует полностью универсального и автоматического решения этой проблемы.

  • Если вы переименуете столбец и сравните только и только схемы? Столбец будет удален и создан пустым.

  • Если вы разделите столбец FullName на Name, MidleName, SurName. Как сравнение схемы должно иметь дело с этим?

Конечно, эти образцы можно продолжать и продолжать.

1 голос
/ 15 февраля 2010

Функциональность SQL Compare также доступна в виде библиотек и задокументирована как таковая. Я использовал эти библиотеки в консольном приложении, проблем не было.

1 голос
/ 12 февраля 2010

Вы можете попробовать немного изменить свой подход.

Я разрабатываю инструмент под названием Wizardby , который позволяет записывать переносы базы данных в специальный DSL. Таким образом, вместо того, чтобы полагаться на хрупкие алгоритмы сравнения схем (например, ни один из них не может правильно обрабатывать переименования столбцов / таблиц), вы записываете все изменения в схему базы данных в файл mdl, который впоследствии компилируется Wizardby в платформу. конкретный SQL. Его также можно интегрировать в процесс сборки.

...