Фон
Я приехал с нескольких лет, работая в компании, где все объекты базы данных были сохранены в управлении исходным кодом, одном файле на объект. У нас был список всех объектов, который велся, когда новые объекты были добавлены (чтобы позволить нам выполнять сценарии в порядке и зависимостях от дескриптора) и сценарий VB, который работал для создания одного большого сценария для выполнения против базы данных.
Все таблицы были, 'создают, если не существует', и весь SP и т.д. были отбрасывание и воссоздает.
До настоящего времени и я теперь работаю в месте, где база данных является ведущим устройством и нет никакого управления исходным кодом для объектов DB, но мы действительно используем инструменты redgate для обновления нашей производственной базы данных (SQL выдерживают сравнение), который очень удобен, и требует небольшой работы.
Вопрос
Как Вы обрабатываете свои объекты DB? Мне нравится иметь их при управлении исходным кодом (и, поскольку мы используем МЕРЗАВЦА, я хотел бы смочь обработать конфликты слияния в сценариях, а не DB), но я собираюсь быть нажатым для заканчивания простоты использования SQL, выдерживают сравнение для обновления базы данных.
Я действительно не хочу иметь нас обновляющий сценарии в МЕРЗАВЦЕ, и затем использующий SQL выдерживают сравнение для обновления производственной базы данных от нашего DB DEV, поскольку у меня была бы 'одна версия истины', но я действительно не хочу входить в перезапись пользовательского бита программного обеспечения для связывания всех из сценариев вместе.
Я думаю, что выпуск базы данных Visual Studio может сделать что-то подобное этому, но я не уверен, будет ли у нас бюджет для него.
Я уверен, что это спросили до смерти, но я не могу найти ничего, что, кажется, вполне имеет ответ, который я ищу. Подобный этому, но не совсем тому же:
Что является лучшими практиками для сценариев базы данных под управлением кодом
Спасибо за все большие ответы - у всех есть их достоинства, таким образом, я собираюсь взять самое высокое голосование, но аплодисменты для всего входа.
У нас все объекты базы данных находятся под контролем версий с помощью Visual Studio Database Edition (DBPro). Это замечательный инструмент, который контролирует нашу схему версией, выполняет сборки, проверки, позволяет анализ кода, сравнение схем, развертывание, сравнение данных, рефакторинг и т. Д. Он был разработан с нуля как система управления БД и контроля версий. Настоятельно рекомендуется.
Это блог ведущего архитектора DBPro: щелкните здесь
У нас есть система, в которой база данных номинально является мастером - внутри нашей системы контроля исходных текстов мы поддерживаем последовательность скриптов "изменения схемы" (файлы .sql), каждый из которых отвечает за идемпотентный откат изменения, а затем его применение. Каждый скрипт просто нумеруется, поэтому у нас есть 000.sql (который создает базу данных и устанавливает стандартные объекты), 001.sql и т.д.
Во время разработки разработчик пишет сценарий изменения схемы и запускает его на базе данных разработки. Каждое изменение должно добавлять строку в таблицу dba.change_info
, содержащую номер изменения и краткое описание. Чтобы откатить изменение, можно просто запустить его первую секцию. Для SQL Server идемпотентность секции отката обрабатывается путем изучения sysobjects и т.д. перед выдачей команд DROP - аналогично конструкции "drop ... if exists". Изменения схемы могут потребовать миграции данных, если модель изменяется, а не просто добавляется, а также используются для поддержания справочных данных.
В процессе выпуска релиза DBA (у нас небольшая компания, поэтому эту роль в любом случае берет на себя один из разработчиков) применяет изменения схемы для релиза к производственной базе данных между остановкой старой версии приложений и запуском обновленной.
Все это довольно ручной процесс, но он удовлетворяет таким требованиям, как миграция данных из одной модели в другую: например, расширение булевого флага до набора опций или преобразование ассоциации "многие-к-одному" в "многие-ко-многим". Как правило, это не то, что может быть создано с помощью простых инструментов сравнения схем. Это также позволяет разделить роли - хотя на практике мы все имеем полный доступ к production, разделение достаточно велико, чтобы "DBA" мог читать и просматривать .sql файлы, которые будут применяться в production.
По крайней мере, в теории, полная база данных (содержащая только справочные данные) может быть построена путем простого выполнения всех изменений схемы по порядку для 000.sql и далее. На практике мы не делаем этого регулярно, а скорее копируем нашу производственную базу данных в dev и затем применяем сценарии изменений перед проведением регрессионных тестов перед релизом. Это служит для проверки самих сценариев изменений, но практично только для производственных баз данных среднего размера.
В настоящее время я поддерживаю проект базы данных в инструменте моделирования (DeZine для баз данных) и храню его в системе контроля версий. В моем дизайне таблицы я добавляю таблицу с двумя строками, которые имеют номер версии схемы и справочных данных, они обновляются каждый раз, когда база данных изменяется / выпускается (пользователи не имеют доступа к этой таблице).
Справочные данные хранятся в электронной таблице Excel (также в системе управления версиями), которая может генерировать сценарий SQL из операторов INSERT для заполнения новых баз данных.
Когда требуется новый выпуск, рассылаются сценарий схемы, сценарий справочных данных и пакет установщика. Пакет установщика переименовывает старую базу данных, создает новую базу данных из сценария и импортирует новые справочные данные (которые также могут измениться). Затем данные пользователя копируются из старой (переименованной) базы данных в новую.
Это имеет то преимущество, что, когда что-то пойдет не так, вы можете вернуться к исходной базе данных, поскольку она не была изменена.
Взгляните на эту серию из пяти частей о принципах и методах управления версиями баз данных (К. Скотт Аллен):
Пять частей важны, но в основном идея состоит в том, чтобы иметь базовый план, а затем изменять скрипты (с таблицей версий). Обновление базы данных означает применение сценариев изменения «над» текущей версией. И эта стратегия очень дружелюбна к VCS (без конфликтов).
Если вы уже используете инструменты Red Gate, вы можете рассмотреть возможность использования SQL Source Control, который работает бок о бок с SQL Compare и SQL Data Compare, позволяя одной версии истины существовать в контроле исходных текстов. На данный момент он находится в раннем доступе, но большая часть функциональности уже есть, и ее можно опробовать. Вы можете загрузить его с http://www.red-gate.com/Products/SQL_Source_Control/index.htm . Однако на данный момент он поддерживает только SVN и TFS. Вы уже перешли на GIT?
Дэвид (менеджер по продуктам в Red Gate)
.Именно для этого есть специальный инструмент. Он называется Wizardby :
... среда непрерывной интеграции базы данных и миграции схемы
Я не очень хорошо знаком с инструментарием RedGate, но если он похож на dbGhost , должна быть утилита, которая позволяет вам создавать сценарии объектов базы данных для файлов по одному для каждого объекта. В этом случае я бы предложил следующее:
diff
, если таковые имеются. Это будет указывать на то, что структура базы данных DEV изменилась и не отражена в системе управления версиями .diff
] для этого) Если у вас много баз данных DEV (по одной на пользователя или ветку разработки) и это слишком громоздко, то, вероятно, лучшей комбинацией будет выполнение такой задачи на ЭТАПЕ
(ТЕСТ просто перед выпуском) версии базы данных, после чего вы сохраните схему PROD в репозитории и обновите ее со STAGE только на этапе предварительного тестирования, где вы убедитесь, что изменения вашей схемы также присутствуют в репозитории.
Таким образом, разработчики по-прежнему могут работать обычным образом: сначала измените схему в базе данных DEV, и, надеюсь, вы получите баланс между гибкостью
и одной истиной
, которую вы хотели бы .
В моей команде мы добавляем изменения в VCS, как только изменяем базу данных DEV, но у нас все еще есть такая задача, чтобы сравнить схемы между различными базами данных (DEV, STAGE и PROD). По сути, мы следуем тому, что я однажды ответил в Как вы должны построить свою базу данных из системы контроля версий? .
Предполагая, что вы используете платформу .net, взгляните на Fluent Migrator , а также на Прослушивание подкаста Code , в котором рассказывается о проекте.
Основная цель, как я вижу, состоит в том, чтобы легко кодировать миграции, как вы делаете обычное кодирование с использованием свободного интерфейса и подхода, не зависящего от базы данных.
Он построен на основе .NET Framework. и работает с рядом форматов баз данных, включая SQL Server, SqlLite и MySQL.
Преимущество этого подхода в том, что он живет с остальной частью вашего кода и, следовательно, может управляться SCM
Пример:
[Migration(1)]
public class CreateProjectsTable : Migration
{
public void Up()
{
Create.Table("Projects")
.WithIdColumn()
.WithColumn("Name").AsString().NotNullable()
.WithColumn("Position").AsInt32().NotNullable()
.WithColumn("Done").AsBoolean().NotNullable();
}
public void Down()
{
Database.RemoveTable("Projects");
}
}
На работе мы активно используем мощный инструмент, который поставляется как часть ActiveRecord (который является стандартным ORM, поставляемым с Rails веб-фреймворком) под названием Миграции.
Базовая миграция будет выглядеть следующим образом:
class AddSystems < ActiveRecord::Migration
def self.up
create_table :systems do |t|
t.string :name
t.string :label
t.text :value
t.string :type
t.integer :position, :default => 1
t.timestamps
end
end
def self.down
drop_table :systems
end
end
Для каждого изменения базы данных создается миграция, и они создаются в последовательном порядке по метке времени. Вы можете запустить заранее определенные методы для запуска этих миграций в правильном порядке, чтобы ваша база данных всегда могла быть создана и/или откачена. Некоторые из функций приведены ниже:
rake db:migrate #run all outstanding migrations
rake db:rollback #roll back the last run migration
rake db:seed #fill the database with your seed data
Миграции имеют методы для создания таблиц, удаления таблиц, обновления таблиц, добавления индексов и т.д. Полный набор. Миграции также автоматически добавляют колонку id
, а секция t.timestamps
автоматически генерирует поле "created_at" и поле "updated_at".
Большинство языков имеют такие средства ORM, и они позволяют поддерживать базу данных в состоянии, подобном коду, что легко для понимания разработчиков, а также достаточно просто для использования и обслуживания DBA.