Автоматическая генерация сценариев изменения базы данных
Я ищу способ автоматизировать создание сценариев изменений для наших баз данных.
В настоящее время мы используем версию базы данных 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>
Ответ 4
Кажется, что 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.
Ответ 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.
Если вам нужна дополнительная информация о рекомендуемом процессе или более предписывающих шагах, пожалуйста, дайте мне знать.