Есть ли система контроля версий для изменения структуры базы данных?
Я часто сталкиваюсь со следующей проблемой.
Я работаю над некоторыми изменениями в проекте, которые требуют новых таблиц или столбцов в базе данных. Вношу изменения в базу данных и продолжаю работу. Обычно я не забываю записывать изменения, чтобы их можно было воспроизвести в действующей системе. Однако я не всегда помню, что я изменил, и не всегда не забываю это записывать.
Итак, я нажимаю на живую систему и получаю большую, очевидную ошибку, которой нет NewColumnX
, тьфу.
Независимо от того, что это может быть не лучшей практикой в данной ситуации, существует ли система контроля версий для баз данных? Меня не волнует конкретная технология баз данных. Я просто хочу знать, существует ли он. Если получится работать с MS SQL Server, то отлично.
Ответов (22)22
В Ruby on Rails есть концепция миграции - быстрый сценарий для изменения базы данных.
Вы создаете файл миграции, в котором есть правила для увеличения версии базы данных (например, добавление столбца) и правила для понижения версии (например, удаление столбца). Каждая миграция пронумерована, а таблица отслеживает текущую версию вашей базы данных.
Чтобы выполнить миграцию , вы запускаете команду под названием «db: migrate», которая просматривает вашу версию и применяет необходимые сценарии. Аналогичным образом вы можете перейти вниз.
Сами сценарии миграции хранятся в системе контроля версий - всякий раз, когда вы меняете базу данных, вы регистрируете новый сценарий, и любой разработчик может применить его, чтобы довести свою локальную базу данных до последней версии.
Для Oracle я использую Toad , который может выгружать схему в несколько отдельных файлов (например, по одному файлу на таблицу). У меня есть несколько скриптов, которые управляют этой коллекцией в Perforce, но я думаю, что это должно быть легко выполнимо практически в любой системе контроля версий.
Я бы рекомендовал один из двух подходов. Во-первых, инвестируйте в PowerDesigner от Sybase. Enterprise Edition. Он позволяет создавать физические модели данных и многое другое. Но он поставляется с репозиторием, который позволяет вам проверять свои модели. Каждая новая проверка может быть новой версией, она может сравнивать любую версию с любой другой версией и даже с тем, что находится в вашей базе данных в то время. Затем он представит список всех различий и спросит, что следует перенести… и затем он создаст сценарий для этого. Это недешево, но это выгодная сделка в два раза дороже, а окупаемость инвестиций составляет около 6 месяцев.
Другая идея - включить аудит DDL (работает в Oracle). Это создаст таблицу с каждым внесенным вами изменением. Если вы запросите изменения из метки времени, на которую вы в последний раз переместили изменения базы данных в prod прямо сейчас, у вас будет упорядоченный список всего, что вы сделали. Несколько предложений where для исключения изменений с нулевой суммой, таких как create table foo; за которым следует drop table foo; и вы можете ЛЕГКО создать сценарий мода. Зачем хранить изменения в вики, это вдвойне труднее. Позвольте базе данных отслеживать их за вас.
Вы можете использовать Microsoft SQL Server Data Tools в Visual Studio для создания сценариев для объектов базы данных как части проекта SQL Server. Затем вы можете добавить скрипты в систему управления версиями, используя интеграцию системы управления версиями, встроенную в Visual Studio. Кроме того, проекты SQL Server позволяют проверять объекты базы данных с помощью компилятора и генерировать сценарии развертывания для обновления существующей базы данных или создания новой.
Существует «фреймворк миграции базы данных» PHP5 под названием Ruckusing. Я не использовал его, но примеры показывают идею: если вы используете язык для создания базы данных по мере необходимости, вам нужно только отслеживать исходные файлы.
Я пишу свои сценарии выпуска базы данных параллельно с кодированием и храню сценарии выпуска в отдельном разделе проекта в SS. Если я вношу изменение в код, требующий изменения базы данных, я одновременно обновляю сценарий выпуска. Перед выпуском я запускаю сценарий выпуска на чистой dev db (структура скопирована из производственной среды) и провожу окончательное тестирование на ней.
Пусть ваши начальные операторы создания таблицы находятся в контроллере версий, а затем добавьте операторы изменения таблицы, но никогда не редактируйте файлы, просто добавьте несколько файлов изменения, которые в идеале называются последовательно, или даже в виде «набора изменений», чтобы вы могли найти все изменения для конкретного развертывания.
Самая сложная часть, которую я вижу, - это отслеживание зависимостей, например, для конкретной таблицы развертывания B может потребоваться обновление перед таблицей A.
Взгляните на пакет Oracle DBMS_METADATA.
В частности, особенно полезны следующие методы:
DBMS_METADATA.GET_DDL
DBMS_METADATA.SET_TRANSFORM_PARAM
DBMS_METADATA.GET_GRANTED_DDL
Как только вы ознакомитесь с тем, как они работают (что довольно очевидно), вы можете написать простой скрипт для вывода результатов этих методов в текстовые файлы, которые можно будет поместить в систему контроля версий. Удачи!
Не уверен, есть ли что-то настолько простое для MSSQL.
Если вы используете SQL Server, будет сложно превзойти Data Dude (также известную как Database Edition Visual Studio). Как только вы освоитесь с этим, сравните схему между версией базы данных, управляемой исходным кодом, и производственной версией - одно дело. И одним щелчком мыши вы можете сгенерировать свой DDL для различий.
На MSDN есть обучающее видео, которое очень полезно.
Я знаю о DBMS_METADATA и Toad, но если бы кто-то мог придумать Data Dude для Oracle, жизнь была бы действительно сладкой.
Я делал это время от времени - управлял (или пытался управлять) версиями схемы. Лучшие подходы зависят от имеющихся у вас инструментов. Если вы получите инструмент Quest Software "Schema Manager", вы будете в хорошей форме. У Oracle есть собственный неполноценный инструмент, который также называется «Диспетчер схем» (что сбивает с толку?), Который я не рекомендую.
Без автоматизированного инструмента (см. Другие комментарии о Data Dude здесь) вы будете использовать скрипты и файлы DDL напрямую. Выберите подход, задокументируйте его и неукоснительно следуйте ему. Мне нравится иметь возможность воссоздать базу данных в любой момент, поэтому я предпочитаю иметь полный DDL-экспорт всей базы данных (если я администратор базы данных) или схемы разработчика (если я использую продукт -разработка).
PLSQL Developer, a tool from All Arround Automations, has a plugin for repositories that works OK ( but not great) with Visual Source Safe.
From the web:
Подключаемый модуль управления версиями обеспечивает тесную интеграцию между PL / SQL Developer IDE >> и любой системой управления версиями, которая поддерживает спецификацию интерфейса Microsoft SCC. >> Сюда входят самые популярные системы контроля версий, такие как Microsoft Visual SourceSafe, >> Merant PVCS и MKS Source Integrity.
ER Studio позволяет преобразовать схему базы данных в инструмент, а затем сравнить ее с действующими базами данных.
Пример: измените схему разработки в ER Studio - сравните ее с производственной, и в ней будут перечислены все различия. Он может записать изменения или просто протолкнуть их автоматически.
Создав схему в ER Studio, вы можете либо сохранить сценарий создания, либо сохранить его как проприетарный двоичный файл и сохранить в системе контроля версий. Если вы когда-нибудь захотите вернуться к предыдущей версии схемы, просто проверьте ее и отправьте на свою платформу db.
Рекомендации по двум книгам: «Рефакторинг баз данных» Эмблера и Садаладжа и «Методы гибкой разработки баз данных» Эмблера.
Кто-то упомянул Rails Migrations. Я считаю, что они отлично работают даже вне приложений Rails. Я использовал их в приложении ASP с SQL Server, которое мы переводили на Rails. Вы проверяете сами сценарии миграции в VCS. Вот сообщение прагматика Дэйва Томаса по этому поводу.
Мы довольно успешно использовали MS Team System Database Edition . Он более или менее легко интегрируется с системой управления версиями TFS и Visual Studio и позволяет нам легко управлять сохраненными процессами, представлениями и т. Д. Разрешение конфликтов может быть сложной задачей, но история версий завершена, как только это будет сделано. После этого переход на QA и продакшн становится чрезвычайно простым.
Однако справедливо сказать, что это продукт версии 1.0, и он не лишен некоторых проблем.
Я немного сторонник старой закалки в том, что использую исходные файлы для создания базы данных. На самом деле существует 2 файла - project-database.sql и project-updates.sql - первый для схемы и постоянных данных, а второй - для модификаций. Конечно, оба находятся под контролем версий.
При изменении базы данных я сначала обновляю основную схему в project-database.sql, а затем копирую соответствующую информацию в project-updates.sql, например операторы ALTER TABLE. Затем я могу применить обновления к базе данных разработки, протестировать, выполнить итерацию, пока все не будет сделано хорошо. Затем верните файлы, проверьте еще раз и примените к производственной среде.
Кроме того, у меня обычно есть таблица в db - Config, например:
SQL
CREATE TABLE Config
(
cfg_tag VARCHAR(50),
cfg_value VARCHAR(100)
);
INSERT INTO Config(cfg_tag, cfg_value) VALUES
( 'db_version', '$Revision: $'),
( 'db_revision', '$Revision: $');
Затем я добавляю в раздел обновлений следующее:
UPDATE Config SET cfg_value='$Revision: $' WHERE cfg_tag='db_revision';
db_version
Получает только изменилась , когда база данных создается заново, и db_revision
дает мне представление о том , как далеко дБ от базовой линии.
Я мог бы хранить обновления в отдельных файлах, но я решил объединить их все вместе и использовать вырезание и вставку для извлечения соответствующих разделов. Нужно еще немного подработать, например, удалить ":" из $ Revision 1.1 $, чтобы заморозить их.
Я очень рекомендую дельту SQL . Я просто использую его для создания сценариев различий, когда я закончу кодирование своей функции и проверю эти сценарии в моем инструменте управления версиями (Mercurial :))
У них есть как SQL-сервер, так и версия Oracle.
Schema Compare for Oracle - это инструмент, специально разработанный для переноса изменений из нашей базы данных Oracle в другую. Перейдите по указанному ниже URL-адресу, чтобы перейти по ссылке для загрузки, где вы сможете использовать программное обеспечение для полнофункциональной пробной версии.
http://www.red-gate.com/Products/schema_compare_for_oracle/index.htm
MyBatis (ранее iBatis) имеет инструмент миграции схемы , который можно использовать в командной строке. Он написан на java, но может использоваться с любым проектом.
Чтобы добиться хорошей практики управления изменениями базы данных, нам необходимо определить несколько ключевых целей. Таким образом, система миграции схемы MyBatis (или сокращенно MyBatis Migrations) стремится:
- Работа с любой базой данных, новой или существующей
- Используйте систему управления версиями (например, Subversion)
- Разрешить параллельным разработчикам или командам работать независимо
- Разрешить конфликты очень заметными и легко управляемыми
- Разрешить прямую и обратную миграцию (развиваться, переходить соответственно)
- Сделайте текущий статус базы данных легкодоступным и понятным
- Разрешить миграцию, несмотря на привилегии доступа или бюрократию
- Работаем по любой методике
- Поощряет хорошие, последовательные практики
Интересно, что никто не упомянул об инструменте Liquibase с открытым исходным кодом, который основан на Java и должен работать почти для каждой базы данных, поддерживающей jdbc. По сравнению с рельсами он использует xml вместо ruby для выполнения изменений схемы. Хотя мне не нравится xml для языков, специфичных для предметной области, очень крутым преимуществом xml является то, что Liquibase знает, как откатить определенные операции, такие как
<createTable tableName="USER">
<column name="firstname" type="varchar(255)"/>
</createTable>
Так что вам не нужно справляться с этим самостоятельно
Также поддерживаются чистые операторы sql или импорт данных.
У Redgate есть продукт под названием SQL Source Control . Он интегрируется с TFS, SVN, SourceGear Vault, Vault Pro, Mercurial, Perforce и Git.