Существует ли система контроля версий для изменения структуры базы данных?

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

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

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

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

22 ответа

Решение

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

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

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

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

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

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

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

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

Redgate имеет продукт, называемый SQL Source Control. Он интегрируется с TFS, SVN, SourceGear Vault, Vault Pro, Mercurial, Perforce и Git.

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

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

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

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

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

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

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

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

На MSDN есть обучающее видео, которое очень полезно.

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

Сделайте ваши первоначальные операторы создания таблицы в контроллере версий, затем добавьте операторы alter table, но никогда не редактируйте файлы, просто добавляйте файлы с идеальным последовательным именем или даже как "набор изменений", чтобы вы могли найти все изменения для конкретного развертывания.

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

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

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

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

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

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

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

Я пишу свои сценарии выпуска БД параллельно с кодированием и храню сценарии выпуска в разделе, посвященном конкретному проекту, в SS. Если я внесу изменение в код, который требует изменения базы данных, я обновлю сценарий выпуска одновременно. Перед выпуском я запускаю скрипт выпуска на чистой базе данных разработчика (копируемую структуру с производства) и выполняю на нем финальное тестирование.

Я делал это время от времени - управлял (или пытался управлять) версиями схемы. Лучшие подходы зависят от инструментов, которые у вас есть. Если вы сможете приобрести инструмент Quest Software "Schema Manager", вы будете в хорошей форме. У Oracle есть собственный, более низкий инструмент, который также называется "Диспетчер схем" (много смущает?), Который я не рекомендую.

Без автоматизированного инструмента (см. Другие комментарии здесь о Data Dude) вы будете напрямую использовать скрипты и файлы DDL. Выберите подход, задокументируйте его и строго придерживайтесь. Мне нравится иметь возможность заново создавать базу данных в любой момент, поэтому я предпочитаю иметь полный экспорт DDL всей базы данных (если я администратор баз данных) или схемы разработчика (если я в продукте) режим разработки).

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

Пример: переверните вашу схему разработки в ER Studio - сравните ее с производственной, и она перечислит все различия. Он может записать изменения или просто протолкнуть их автоматически.

Получив схему в ER Studio, вы можете либо сохранить сценарий создания, либо сохранить его как собственный двоичный файл и сохранить его в системе управления версиями. Если вы когда-нибудь захотите вернуться к прошлой версии схемы, просто проверьте ее и отправьте на свою платформу БД.

PLSQL Developer, инструмент от All Arround Automations, имеет плагин для репозиториев, который работает нормально (но не очень) с Visual Source Safe.

Из Интернета:

Плагин управления версиями обеспечивает тесную интеграцию между IDE разработчика PL / SQL >> и любой системой управления версиями, которая поддерживает спецификацию интерфейса Microsoft SCC. >> Сюда входят самые популярные системы контроля версий, такие как Microsoft Visual SourceSafe, >> Merant PVCS и MKS Source Integrity.

http://www.allroundautomations.com/plsvcs.html

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

Мы использовали MS Team System Database Edition с довольно хорошим успехом. Он более или менее плавно интегрируется с управлением версиями TFS и Visual Studio и позволяет легко управлять сохраненными процессами, представлениями и т. Д. Разрешение конфликтов может быть проблемой, но история версий завершена, как только это будет сделано. После этого переход к QA и производству чрезвычайно прост.

Справедливо сказать, что это продукт версии 1.0, хотя и не без проблем.

Инструменты визуализации Microsoft SQL Server можно использовать в Visual Studio для генерации сценариев для объектов базы данных в рамках проекта SQL Server. Затем вы можете добавить сценарии в систему управления версиями, используя интеграцию системы управления версиями, встроенную в Visual Studio. Кроме того, проекты SQL Server позволяют проверять объекты базы данных с помощью компилятора и генерировать сценарии развертывания для обновления существующей базы данных или создания новой.

В отсутствие VCS для изменений таблиц я регистрировал их в вики. По крайней мере, тогда я вижу, когда и почему это было изменено. Это далеко не идеально, так как не все это делают, и у нас есть несколько версий продукта, но лучше, чем ничего.

Schema Compare for Oracle - это инструмент, специально разработанный для переноса изменений из нашей базы данных Oracle в другую. Пожалуйста, посетите URL ниже для ссылки на скачивание, где вы сможете использовать программное обеспечение для полнофункциональной пробной версии.

http://www.red-gate.com/Products/schema_compare_for_oracle/index.htm

Я бы порекомендовал один из двух подходов. Во-первых, инвестируйте в PowerDesigner от Sybase. Enterprise Edition. Это позволяет вам проектировать физические модели данных и многое другое. Но он поставляется с хранилищем, которое позволяет вам проверять ваши модели. Каждая новая регистрация может быть новой версией, она может сравнивать любую версию с любой другой версией и даже с тем, что находится в вашей базе данных в то время. Затем он представит список всех различий и спросит, какие из них следует перенести... и затем создаст сценарий для этого. Это не дешево, но выгодно в два раза дороже, а рентабельность инвестиций составляет около 6 месяцев.

Другая идея - включить аудит DDL (работает в Oracle). Это создаст таблицу с каждым внесенным вами изменением. Если вы запросите изменения из отметки времени, когда вы в последний раз перемещали изменения базы данных в prod прямо сейчас, у вас будет упорядоченный список всего, что вы сделали. Несколько предложений where для исключения изменений с нулевой суммой, таких как create table foo; с последующей дроп-таблицей foo; и вы можете легко построить сценарий мода. Зачем хранить изменения в вики, это двойная работа. Позвольте базе данных отследить их для вас.

Две рекомендации книги: "Рефакторинг баз данных" от Ambler и Sadalage и "Agile Database Techniques" от Ambler.

Кто-то упомянул Rails Migrations. Я думаю, что они отлично работают, даже за пределами приложений Rails. Я использовал их в приложении ASP с SQL Server, которое мы перешли на Rails. Вы проверяете сами скрипты миграции в VCS. Вот пост прагматичного Дейва Томаса на эту тему.

Другие вопросы по тегам