Я хотел бы сохранить схему и «статические» данные базы данных SQL Server в виде кода в системе контроля версий. Я также хотел бы иметь возможность развертывать определенные версии кода базы данных в реальных экземплярах соответствующей базы данных, т. е. переносить базу данных на новую версию (и, при необходимости, «мигрировать» на старую версию).
Я предполагаю, что мне не нужно объяснять, что такое база данных или что SQL Server — это особая система баз данных, то есть специальное программное обеспечение для управления базами данных.
Разработчикам программного обеспечения , работающим с базами данных, желательно уметь поддерживать « схему » базы данных, т. е. информацию о ее структуре, в виде « кода ». Этот код должен позволить кому-то создать базу данных с той же «схемой», которая представлена в коде. Код может быть в форме операторов DDL ( язык определения данных ), например, код SQL , обычно в его версии для конкретного поставщика, который используется для создания таких объектов, как таблицы и индексы в базе данных, или он может быть в общем виде. язык программирования , например Java , Ruby , C#, так далее.
Как только схема базы данных представлена в коде, этот код может поддерживаться в системе управления версиями или системой управления версиями, программным обеспечением для управления контролем версий. Из Википедии:
Контроль версий, также известный как контроль версий и контроль версий (и аспект управления конфигурацией программного обеспечения), представляет собой управление изменениями в документах, компьютерных программах, крупных веб-сайтах и других коллекциях информации.
Сохранение кода, представляющего схему базы данных в системе контроля версий, желательно, поскольку можно сохранить историю изменений схемы, а другие инструменты, такие как набор инструментов, о которых я спрашиваю в этом вопросе, могут получить доступ к схеме, даже разные версии схемы для других целей.
« Развертывание » в контексте разработки программного обеспечения и обслуживания программного обеспечения включает «... все действия, которые делают программную систему доступной для использования». В контексте этого вопроса меня интересуют рекомендации по программным средствам для предоставления определенной версии схемы базы данных в виде конкретных конкретных экземпляров баз данных в СУБД SQL Server.
В качестве примера рассмотрим схему базы данных с версиями v1 , v2 и v3 , а также некоторое количество фактических баз данных, каждая из которых имеет одну из этих версий схемы. Для этого вопроса рекомендуемое программное обеспечение должно быть способно обновлять (или понижать версию) конкретной базы данных с ее текущей версии до любой другой версии той же схемы, и оно должно использовать код для конкретной версии схемы, которая хранится в системе контроля версий.
«выберите запись управления версиями, содержащую схему, (пере)оцените БД для соответствия (что именно это означает?»
Схема базы данных представлена в виде кода в системе контроля версий. Меня не интересуют инструменты, работающие напрямую с контролем версий. Инструменты, в отношении которых этот вопрос запрашивает рекомендации, должны иметь возможность использовать «версию» схемы базы данных. Примером «версии» схемы может быть код, представляющий схему для конкретной версии («фиксация» в Git) или определенный тег/метка для систем контроля версий, которые поддерживают такие функции.
Вот основной список функций, которые должны быть предоставлены инструменту для «(пере)оценки [целевой] БД для соответствия»:
NULL
значений), я не знаю, нужно ли предусмотреть что-то особенное. самим инструментом, чтобы справиться с этим. Однако , если рекомендуемый инструмент использует некоторую форму «кода схемы», которая не является стандартными операторами DDL соответствующей СУБД 2 , тогда инструмент должен предоставлять некоторые средства для указания начальных значений добавляемых столбцов.Некоторые примеры этих объектов включают первичные ключи, ограничения внешнего ключа, значения по умолчанию и индексы.
Под «другим объектом» я подразумеваю такие объекты, как представления, хранимые процедуры, определяемые пользователем функции и т. д. Эти объекты обычно (?) можно безопасно удалить и воссоздать. Рекомендуемый инструмент должен иметь возможность удалять и воссоздавать эти объекты в необходимом порядке для объектов, которые зависят от других таких объектов (например, представление, которое ссылается на другое представление).
Строки в таблице со "статическими" данными для синхронизации должны быть идентифицированы значениями столбцов в первичном ключе для этой таблицы.
Строки в таблицах статических данных в целевой базе данных должны быть изменены в соответствии с исходной схемой. Строки в исходной схеме, которых нет в целевой таблице, должны быть вставлены в целевую таблицу. Было бы неплохо, если бы этот инструмент предоставлял возможность указать, следует ли удалять строки, существующие в целевой таблице, но не существующие в исходной схеме.
1 На самом деле это потенциально тонкий момент! Большинство инструментов, вероятно, будут реализовывать «одинаковость» для объектов базы данных, имеющих одно и то же имя . Но есть альтернативы, по крайней мере, для некоторых СУБД, например, в SQL Server, расширенные свойства могут использоваться для реализации формы постоянной идентификации для объектов базы данных, которая не зависит от имени объекта. Это было бы удобно, поскольку тогда инструмент мог бы автоматически обрабатывать (по крайней мере, некоторые) случаи, когда объекты переименовываются.
2 Я спросил конкретно о SQL Server, но на данный момент мне бы очень понравилось, если бы кто- нибудь вообще дал ответ на этот вопрос для любой СУБД.
Перед вами несколько вариантов.
Liquibase (бесплатная лицензия Apache) — единственный известный мне бесплатный вариант, поддерживающий SQL Server. Это собственный пакет управления исходным кодом, а это значит, что вам придется изучить другой набор команд и разобраться с ветвлением, слиянием и т. д. Преимущество Liquibase в том, что если вы знаете Java, вы можете создать собственную автоматизацию, используя библиотеки Liquibase. .
Offscale (бесплатная, неуказанная лицензия) идет немного дальше, позволяя вам также управлять исходными наборами данных, выполнять автоматическое тестирование данной модели с помощью тестового набора данных. К сожалению, нет поддержки SQL Server.
Redgate SQL Source Control — хороший коммерческий вариант. Он поддерживает SQL Server, Oracle и т. д., а также множество проверенных и надежных платформ управления исходным кодом (svn, git, mercurial, perforce и т. д.). Он также поддерживает управление версиями данных. У них есть сопутствующий продукт для непрерывной интеграции (автоматического развертывания) и множество других инструментов в том же пространстве. На мой взгляд, слишком дорого для личного использования, но очень недорого для корпоративного использования. Есть бесплатная пробная версия.
Продукты DB Ghost удовлетворяют требованиям.
Продукт Change Manager может генерировать сценарии ( DROP
и CREATE
сценарии, которые можно запускать «вручную») для всех объектов схемы, а также для статических данных. Продукт Change Manager Professional можно автоматизировать для этого с помощью командной строки, например, для регулярного написания сценариев для конкретной базы данных разработки.
Продукты Packager, Packager Plus и Packager Plus Professional могут развертывать изменения в виде определенной версии сценариев, созданных диспетчером изменений. Packager Plus может выполнять «динамическое обновление», в основном «синхронизацию» схемы и статических данных между целевой базой данных и исходной базой данных, где исходная база данных может быть создана из сценариев. Packager Plus также может создать исполняемый файл, который можно распространять для выполнения динамического обновления в соответствующей целевой среде. Packager Plus Professional можно автоматизировать для выполнения всего вышеперечисленного через командную строку.
Одна из распространенных стратегий сохранения изменений в схеме базы данных включает в себя явную поддержку миграции базы данных как для обновления, так и для понижения версии. Миграция фактически представляет собой код для выполнения одного изменения в экземпляре базы данных схемы.
Вы можете поддерживать миграции с помощью DB Ghost, но он только позволяет вам это делать, он определенно не поддерживает его дальше. Тем не менее, я думаю, что это хорошая вещь.
Вместо миграции баз данных во время развертывания DB Ghost «синхронизирует» целевую базу данных (базу данных, в которую вы хотите внедрить изменения) с базой данных-источником модели, созданной во время развертывания из определенной версии схемы базы данных. Вместо выполнения определенных миграций он сравнивает исходную и целевую базы данных и вносит необходимые изменения в целевую базу данных для устранения любых обнаруженных различий.
Главное преимущество синхронизации по сравнению с миграцией заключается в том, что вместо поддержки всех сценариев для всех миграций можно (в основном) поддерживать сценарии для текущей версии всех объектов базы данных в схеме. Таким образом, код, представляющий схему, организован по объектам базы данных, а не распределен по (потенциально большому) числу миграций.
Кенни Эвитт