Существует ли система контроля версий для изменения структуры базы данных? - PullRequest
117 голосов
/ 02 августа 2008

Я часто сталкиваюсь со следующей проблемой.

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

Итак, я нажимаю на работающую систему и получаю большую, очевидную ошибку, что NewColumnX, тьфу.

Независимо от того, что это не может быть наилучшей практикой в ​​этой ситуации, существует ли система контроля версий для баз данных? Я не забочусь о конкретной технологии базы данных. Я просто хочу знать, если таковой существует. Если это случится с MS SQL Server, тогда отлично.

Ответы [ 22 ]

61 голосов
/ 02 августа 2008

В Ruby on Rails существует концепция миграции - быстрого скрипта для изменения базы данных.

Вы создаете файл миграции, в котором есть правила для увеличения версии БД (например, добавление столбца) и правила для понижения версии (например, удаление столбца). Каждая миграция пронумерована, и таблица отслеживает вашу текущую версию БД.

Чтобы выполнить миграцию вверх , вы запускаете команду с именем «db: migrate», которая просматривает вашу версию и применяет необходимые сценарии. Вы можете перейти вниз аналогичным образом.

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

30 голосов
/ 27 сентября 2008

Я немного старомоден, так как использую исходные файлы для создания базы данных. На самом деле существует 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 $.

12 голосов
/ 11 июля 2010

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

Чтобы добиться хорошей практики управления изменениями базы данных, нам необходимо определить несколько ключевых целей. Таким образом, система миграции схемы MyBatis (или сокращенно MyBatis) стремится:

  • Работа с любой базой данных, новой или существующей
  • Использование системы контроля версий (например, Subversion)
  • Возможность одновременной работы разработчиков или команд независимо друг от друга
  • Разрешить конфликты, которые очень заметны и легко управляемы
  • Разрешить прямую и обратную миграцию (развиваться, развиваться соответственно)
  • Сделать текущий статус базы данных легкодоступным и понятным
  • Включить миграцию, несмотря на привилегии доступа или бюрократию
  • Работа с любой методологией
  • Поощряет хорошие, последовательные практики
12 голосов
/ 08 июля 2011

Redgate имеет продукт под названием Контроль исходного кода SQL . Он интегрируется с TFS, SVN, SourceGear Vault, Vault Pro, Mercurial, Perforce и Git.

11 голосов
/ 28 мая 2009

Я настоятельно рекомендую SQL-дельта . Я просто использую его для генерации сценариев diff, когда я закончу кодировать свою функцию, и проверяю эти сценарии в своем инструменте управления версиями (Mercurial :))

У них есть версия SQL-сервера и Oracle.

11 голосов
/ 11 июля 2010

Интересно, никто не упомянул инструмент с открытым исходным кодом liquibase , который основан на Java и должен работать почти для каждой базы данных, поддерживающей jdbc. По сравнению с рельсами он использует xml вместо ruby ​​для выполнения изменений схемы. Хотя я не люблю xml для языков, специфичных для предметной области, очень классное преимущество xml состоит в том, что liquibase знает, как откатить некоторые операции, такие как

<createTable tableName="USER"> 
   <column name="firstname" type="varchar(255)"/>
</createTable>

Так что вам не нужно обрабатывать это самостоятельно

Поддерживаются также чистые SQL-операторы или импорт данных.

10 голосов
/ 02 августа 2008

Большинство механизмов баз данных должны поддерживать дамп вашей базы данных в файл. Во всяком случае, я знаю, MySQL. Это будет просто текстовый файл, так что вы можете отправить его в Subversion, или что вы используете. Было бы легко запустить diff для файлов.

9 голосов
/ 10 сентября 2008

Если вы используете SQL Server, было бы сложно победить Data Dude (он же Database Edition Visual Studio). Как только вы это освоите, сравнение схемы между вашей исходной управляемой версией базы данных и версией в рабочей среде будет проще простого. И одним щелчком мыши вы можете создать свой diff DDL.

На MSDN есть очень полезная инструкция видео .

Я знаю о DBMS_METADATA и Toad, но если бы кто-то мог придумать Data Dude для Oracle, тогда жизнь была бы очень приятной.

8 голосов
/ 02 августа 2008

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

8 голосов
/ 02 сентября 2008

Взгляните на пакет оракула DBMS_METADATA.

В частности, особенно полезны следующие методы:

  • DBMS_METADATA.GET_DDL
  • DBMS_METADATA.SET_TRANSFORM_PARAM
  • DBMS_METADATA.GET_GRANTED_DDL

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

Не уверен, что есть что-то такое простое для MSSQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...