Лучшие методики управления изменениями базы данных - PullRequest
13 голосов
/ 11 февраля 2009

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

«Каков один из или некоторые из лучших методов или техник, позволяющих сохранять изменения в базе данных документированными, организованными и в то же время способными эффективно развертываться как в среде одного разработчика, так и в среде нескольких разработчиков».

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

Ответы [ 5 ]

4 голосов
/ 11 февраля 2009

Самый простой способ сделать это без помощи внешнего инструмента - это создать «патч схемы», если хотите. Патч схемы - это простой скрипт t-sql. Патчу схемы присваивается номер версии в скрипте, и этот номер сохраняется в таблице в базе данных для получения изменений.

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

Хорошая книга, в которой есть такие подробности, называется Рефакторинг баз данных .

Если вы хотите использовать внешний инструмент, вы можете взглянуть на проект Ruby's Migrations или аналогичный инструмент на C # под названием Migrator.NET . Эти инструменты работают путем создания классов c # classes / ruby ​​с миграцией «Вперед» и «Назад». Эти инструменты более многофункциональны, потому что они знают, как двигаться вперед и назад в патчах схемы. Однако, как вы заявили, вам не интересен внешний инструмент, но я все равно хотел бы добавить его для других читателей.

4 голосов
/ 11 февраля 2009

Мне скорее понравилась эта серия: http://odetocode.com/Blogs/scott/archive/2008/02/03/11746.aspx

1 голос
/ 11 февраля 2009

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

0 голосов
/ 12 февраля 2009

Что я делаю, это:

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

Хитрость в том, что если база данных не может быть восстановлена ​​для воссоздания, скажем, с добавленным столбцом, у меня есть два изменения для внесения, ALTER TABLE + модификация в сценарии. Немного больше работы, но в долгосрочной перспективе она выигрывает.

0 голосов
/ 11 февраля 2009

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

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

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

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

у меня в голове есть основанный на модели подход (извините, на данный момент не реализованный), в котором изменения схемы «моделируются» (например, для каждого XML), а во время обновления процессор (например, программа ac #) создает все необходимо "sql" и, например, перемещает данные в «dropDatabase». данные могут храниться там, и если по какой-то причине мне нужно восстановить некоторые отброшенные данные, я могу просто сделать это с процессором. я думаю, что через некоторое время (годы) этот подход не так плох, потому что в противном случае разработчики не трогают «старые» таблицы, потому что они больше не знают, действительно ли необходима таблица или столбец. при таком подходе вы не рискуете слишком большим, если что-то уроните!

...