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

99

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

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

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

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

  • 0
  • 0
    В соответствии с нашими указаниями по теме « Некоторые вопросы по-прежнему не по теме, даже если они вписываются в одну из перечисленных выше категорий: ... Вопросы, в которых нас просят рекомендовать или найти книгу, инструмент, библиотеку программного обеспечения, учебное пособие или другое Вне сайта ресурсы не по теме ... »
Теги:
database
version-control

22 ответа

51
Лучший ответ

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

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

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

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

  • 2
    Это выбор для проектов Ruby. Ближайшим эквивалентом этого дизайна в Java является миграция схемы mybatis. Для .NET эквивалентом является code.google.com/p/migratordotnet . Они все отличные инструменты для этой работы IMO.
27

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

Я мог бы хранить обновления в своих отдельных файлах, но я решил объединить их все вместе и использовать cut & paste для извлечения соответствующих разделов. Немного больше домашнего хозяйства в порядке, то есть удалите ':' из $Revision 1.1 $, чтобы заморозить их.

11

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

11

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

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

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

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

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

Таким образом, вам не нужно обращаться с этим собственным

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

  • 0
    мы используем liquibase, но мы используем 3 разных подхода для различной информации: 1. структура (таблица, представления, ...): исторический журнал изменений 2. коды (процедуры, pl / sql, функции): журнал изменений только с одним набором изменений, отмеченным знаком runalways = true runonchange = true 3. таблицы кодов, другие мета-константы, хранящиеся в таблицах: тот же подход, что и для кодов, только один набор изменений, удалить из, вставить всю информацию
  • 0
    Что касается Java, я настоятельно рекомендую посмотреть на flywaydb.org в эти дни - см. Также сравнение возможностей на этом сайте
10

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

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

9

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

  • 12
    Да, но различие файлов SQL не даст вам необходимых сценариев для обновления вашей базы данных dev / prod с одной ревизии на другую.
8

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

Вот очень полезный учебный видео на MSDN.

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

7

Взгляните на пакет Oracle DBMS_METADATA.

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

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

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

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

7

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

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

7

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

6

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

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

Модуль управления версиями обеспечивает тесную интеграцию между IDE PL/SQL Developer ID и любой системой управления версиями, которая поддерживает спецификацию интерфейса SCC. → Это включает в себя самые популярные системы управления версиями, такие как Microsoft Visual SourceSafe, → Merant PVCS и целостность источника MKS.

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

6

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

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

6

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

5

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

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

Как только у вас есть схема в ER Studio, вы можете либо сохранить создание script, либо сохранить его в качестве запатентованного двоичного файла и сохранить его в контроле версий. Если вы когда-нибудь захотите вернуться к предыдущей версии схемы, просто проверьте ее и нажмите на свою платформу db.

5

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

3

Вы можете использовать Microsoft SQL Server Data Tools в visual studio для создания сценариев для объектов базы данных как часть проекта SQL Server. Затем вы можете добавить сценарии в исходный элемент управления, используя интеграцию управления версиями, встроенную в визуальную студию. Кроме того, проекты SQL Server позволяют проверять объекты базы данных с помощью компилятора и создавать сценарии развертывания для обновления существующей базы данных или создания новой.

2

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

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

2

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

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

1

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

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

1

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

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню