Автоматическая генерация сценариев изменения базы данных

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

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

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

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

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

Обновление на основе обратной связи:

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Как упоминалось thijs, Инструменты для создания базы данных Database содержит SqlSchemaCompareTask, который вы можете использовать из своего кода, чтобы сгенерировать изменение script:

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();

В качестве альтернативы вы можете выполнить его, используя конструкцию script через 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>

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

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

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

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

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

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

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