Механизмы для отслеживания [закрытых] изменений схемы DB

Как связать XSD с XML-документом зависит от того, использует ли XML-документ пространства имен или нет ...

Без пространств имен

Используйте xsi:noNamespaceSchemaLocation, чтобы дать подсказку относительно используемого XSD:

  • XML
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="example.xsd">
      <!-- ... -->
    </root>
    
  • XSD
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="root">
        <!-- ... -->
      </xsd:element>
    </xsd:schema>
    

С пространствами имен

Используйте xsi:schemaLocation, чтобы дать подсказку относительно используемого XSD:

  • XML
    <ns:root xmlns:ns="http://example.com/ns"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://example.com/ns example-ns.xsd">
      <!-- ... -->
    </ns:root>
    
  • XSD
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                targetNamespace="http://example.com/ns">
      <xsd:element name="root">
        <!-- ... -->
      </xsd:element>
    </xsd:schema>
    
134
задан Polsonby 29 August 2008 в 19:09
поделиться

15 ответов

В мире направляющих существует понятие миграций, сценариев, в которых изменения в базе данных внесены в Ruby, а не определенном для базы данных аромате SQL. Ваш код миграции Ruby заканчивает тем, что был преобразован в DDL, характерный для Вашей текущей базы данных; это делает переключающиеся платформы базы данных очень легкими.

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

Это руководство Oracle по миграциям направляющих касается миграций вполне хорошо.

Разработчики, использующие другие языки, посмотрели на миграции и реализовали их собственные определенные для языка версии. Я знаю о Ruckusing, система миграций PHP, которая смоделирована после миграций направляющих; это могло бы быть тем, что Вы ищете.

56
ответ дан 23 November 2019 в 23:56
поделиться

Я рекомендовал бы использовать Муравья (кросс-платформенного) для стороны "сценариев" (так как это может практически говорить с любым дб там через jdbc), и Подверсия для исходного репозитория. Муравей будет внизу Вы, чтобы "создать резервную копию" Вашего дб в локальные файлы, прежде, чем внести изменения. 1. скопируйте существующую схему дб в файл через Муравья 2. управление версиями в репозиторий Подверсии через Муравья 3. отправьте новые sql операторы в дб через Муравья

3
ответ дан 23 November 2019 в 23:56
поделиться

Для моего текущего проекта PHP мы используем идею миграций направляющих, и у нас есть каталог миграций, в котором мы сохраняем заголовок файлов "migration_XX.sql", где XX количество миграции. В настоящее время эти файлы создаются вручную, поскольку обновления сделаны, но их создание могло быть легко изменено.

Затем у нас есть сценарий под названием "Migration_watcher", который, как мы находимся в предварительной альфе, в настоящее время работает на каждой загрузке страницы и проверяет, существует ли новый migration_XX.sql файл, где XX больше, чем текущая версия миграции. Раз так это выполняет все migration_XX.sql файлы до наибольшего числа против базы данных и вуаля! изменения схемы автоматизированы.

При требовании способности вернуться, система потребовала бы большой тонкой настройки, но это просто и работало очень хорошо на нашу довольно малочисленную команду к настоящему времени.

3
ответ дан 23 November 2019 в 23:56
поделиться

Мы используем очень простое но эффективное решение.

Для новых установок у нас есть metadata.sql файл в репозитории, который содержит всю схему DB, затем в процессе сборки, мы используем этот файл для генерации базы данных.

Для обновлений мы добавляем обновления в программном обеспечении hardcoded. Мы сохраняем это hardcoded, потому что нам не нравится решать проблемы, прежде чем это действительно БУДЕТ проблема, и такого рода вещь не оказывалась проблемой до сих пор.

Таким образом в нашем программном обеспечении у нас есть что-то вроде этого:

RegisterUpgrade(1, 'ALTER TABLE XX ADD XY CHAR(1) NOT NULL;');

Этот код проверит, находится ли база данных в версии 1 (который хранится в таблице, составленной автоматически), если это устарело, затем команда выполняется.

Для обновления metadata.sql в репозитории мы работаем, это обновляет локально, и затем извлеките полные метаданные базы данных.

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

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

5
ответ дан 23 November 2019 в 23:56
поделиться

Я использовал следующую структуру проекта базы данных в Visual Studio для нескольких проектов, и она работала вполне прилично:

База данных

Сценарии изменения

0. PreDeploy.sql

1. SchemaChanges.sql

2. DataChanges.sql

3. Permissions.sql

Создайте сценарии

Sprocs

Функции

Представления

Наша система сборки затем обновляет базу данных от одной версии до следующего путем выполнения сценариев в следующем порядке:

1. PreDeploy.sql

2. SchemaChanges.sql

Содержание папки Create Scripts

2. DataChanges.sql

3. Permissions.sql

Каждый разработчик регистрируется в их изменениях для конкретной ошибки/функции путем добавления их кода на конец каждого файла. После того как основная версия является завершенной и разветвленной в управлении исходным кодом, содержание .sql файлов в папке Change Scripts удалено.

5
ответ дан 23 November 2019 в 23:56
поделиться

Я создаю папки, названные в честь версий сборки, и помещаю обновление и понижаю сценарии там. Например, у Вас могли быть следующие папки: 1.0.0, 1.0.1 и 1.0.2. Каждый содержит сценарий, который позволяет Вам обновлять или понижать свою базу данных между версиями.

Если клиент или звонок клиента Вы с проблемой с версией 1.0.1 и Вы используете 1.0.2, возвращение базы данных к его версии не будет проблемой.

В Вашей базе данных составьте таблицу, названную "схемой", где Вы вставляете текущую версию базы данных. Затем запись программы, которая может обновить или понизить Вашу базу данных для Вас, легка.

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

4
ответ дан 23 November 2019 в 23:56
поделиться

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

7
ответ дан 23 November 2019 в 23:56
поделиться

Scott Ambler производит большой ряд статей (и написал в соавторстве книгу) на рефакторинге базы данных, с идеей, что необходимо по существу применить принципы TDD и методы к поддержанию схемы. Вы настраиваете серию структуры и отбираете тесты блока данных для базы данных. Затем перед изменением чего-либо Вы изменяете/тесты записи для отражения того изменения.

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

Как оказалось, разработчики также иногда настраивают свою базу данных песочницы и пренебрежение для обновления файла схемы в SVN. Код затем зависит от изменения дб, в котором не зарегистрировались. Такую ошибку может быть невыносимо трудно придавить, но набор тестов возьмет ее сразу же. Это особенно хорошо, если Вам встроили его в больший Непрерывный план Интеграции.

7
ответ дан 23 November 2019 в 23:56
поделиться

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

Затем фиксируйте сценарий в управление исходным кодом наряду с кодом, который работает над ним. Когда необходимо изменить схему наряду с кодом, в сценарии можно зарегистрироваться наряду с кодом, который требует измененной схемы. Затем diffs на сценарии укажет на diffs на изменениях схемы.

С этим сценарием Вы могли интегрировать его с DBUnit или некоторым сценарием сборки, таким образом, кажется, что это могло согласоваться с Вашими уже автоматизированными процессами.

5
ответ дан 23 November 2019 в 23:56
поделиться

K. У Scott Allen есть достойная статья или два на управлении версиями схемы, которое использует понятие сценариев/миграций инкрементного обновления, на которое ссылаются в других ответах здесь; см. http://odetocode.com/Blogs/scott/archive/2008/01/31/11710.aspx.

6
ответ дан 23 November 2019 в 23:56
поделиться

Мои сценарии команды все изменения базы данных и фиксации те сценарии к SVN, наряду с каждым выпуском приложения. Это допускает возрастающие изменения базы данных, не теряя данных.

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

12
ответ дан 23 November 2019 в 23:56
поделиться

Мы используем что-то подобное bcwoord для хранения наших схем базы данных синхронизируемыми через 5 различных установок (производство, подготовка и несколько установок разработки), и сохраненный в управлении версиями, и это работает вполне прилично. Я уточню немного:


Для синхронизации структуры базы данных у нас есть единственный сценарий, update.php, и много файлов, пронумерованных 1.sql, 2.sql, 3.sql, и т.д. Сценарий использует одну дополнительную таблицу для хранения количества текущей версии базы данных. Файлы N.sql обрабатываются вручную, для движения от версии (n-1) до версии N базы данных.

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

Сценарий обновления работает как это:

  • Соединитесь с базой данных.
  • Сделайте резервное копирование текущей базы данных (потому что материал пойдет не так, как надо) [mysqldump].
  • Составьте бухгалтерскую таблицу (названный _meta), если это не существует.
  • Считайте текущую версию из _meta таблицы. Примите 0 если не найденный.
  • Для всех .sql файлов, пронумерованных выше, чем ВЕРСИЯ, выполните их в порядке
  • Если один из файлов произвел ошибку: откатывайте к резервному копированию
  • Иначе обновите версию в бухгалтерской таблице в самый высокий .sql выполняемый файл.

Все входит в управление исходным кодом, и каждая установка имеет сценарий для обновления к последней версии с единственным выполнением сценария (звонящий update.php с надлежащим паролем базы данных и т.д.). Мы подготовка обновления SVN и продуктивные среды с помощью сценария, который автоматически называет сценарий обновления базы данных, таким образом, обновление кода идет с необходимыми обновлениями базы данных.

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


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

Остерегайтесь при вставке запросов от phpMyAdmin хотя! Те сгенерированные запросы обычно включают имя базы данных, которое Вы определенно не хотите, так как оно повредит Ваши сценарии! Что-то как CREATE TABLE mydb.newtable(...) перестанет работать, если базу данных по системе не назовут mydb. Мы создали предварительный комментарий рычаг SVN, который запретит .sql файлы, содержащие mydb строка, которая является верным признаком, который кто-то копирует/вставляет с phpMyAdmin без надлежащей проверки.

50
ответ дан 23 November 2019 в 23:56
поделиться

Если Вы используете C#, взглянули на Дозвуковой, очень полезный инструмент ORM, но, также генерирует sql сценарий к воссозданному Ваша схема and\or данные. Эти сценарии могут затем быть помещены в управление исходным кодом.

http://subsonicproject.com/

5
ответ дан 23 November 2019 в 23:56
поделиться

Проблема здесь действительно упрощает разработчикам сценариев своих локальных изменений в системе управления версиями, чтобы поделиться с командой. Я сталкивался с этой проблемой много лет, и меня вдохновила функциональность Visual Studio для профессионалов в области баз данных. Если вам нужен инструмент с открытым исходным кодом с такими же функциями, попробуйте следующее: http://dbsourcetools.codeplex.com/ Радоваться, веселиться, - Натан.

10
ответ дан 23 November 2019 в 23:56
поделиться

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

0
ответ дан 23 November 2019 в 23:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: