Методология управления версиями SQL

Существует несколько вопросов на ТАК об управлении версиями для SQL и большого количества ресурсов в сети, но я не могу найти что-то, что вполне покрывает то, что я пытаюсь сделать.

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

Требования, чтобы я попытался встретиться:

  • Схема базы данных и данные справочной таблицы являются имеющими версию
  • Сценарии DML для данных прикрепляют к большим таблицам, являются имеющими версию
  • Сервер может быть продвинут от версии N до версии N + X, где X может не всегда быть 1
  • Код не дублирован в системе управления версиями - например, если я добавляю столбец к таблице, я не хочу должным быть удостоверяться, что изменение находится и в создать сценарии и в изменить сценарии
  • Система должна поддерживать несколько клиентов, которые являются в различных версиях для приложения (пытающийся получить их всех до в рамках 1 или 2 выпусках, но не там все же)

Некоторые организации сохраняют возрастающие сценарии изменения в своем управлении версиями, и добираться от версии N до N + 3 необходимо было бы запустить скрипты для N-> N+1 затем N+1-> N+2 затем N+2-> N+3. Некоторые из этих сценариев могут быть повторяющимися (например, столбец добавляется, но затем позже он изменен для изменения типа данных). Мы стараемся избегать этого повторяющегося начиная с части клиента, DBS может быть очень большим, таким образом, эти изменения могли бы занять больше времени, чем необходимый.

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

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

Если бы модераторы думают, что это было бы более соответствующим как общественная Wiki, сообщите мне.

Спасибо!

14
задан Tom H 5 May 2010 в 15:29
поделиться

6 ответов

Я боролся с этим несколько лет, прежде чем недавно принял стратегию, которая, кажется, работает довольно хорошо. Этим я придерживаюсь:

  • База данных не требует независимого управления версиями из приложения
  • Все сценарии обновления базы данных должны быть идемпотентными

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

Конечно, этот метод предъявляет несколько требований к дизайну базы данных:

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

Примеры из недавнего проекта:

001.sql:

if object_id(N'dbo.Registrations') is null 
begin
    create table dbo.Registrations
    (
        [Id]                    uniqueidentifier not null,
        [SourceA]               nvarchar(50)     null,
        [SourceB]               nvarchar(50)     null,
        [Title]                 nvarchar(50)     not null,
        [Occupation]            nvarchar(50)     not null,
        [EmailAddress]          nvarchar(100)    not null,
        [FirstName]             nvarchar(50)     not null,
        [LastName]              nvarchar(50)     not null,
        [ClinicName]            nvarchar(200)    not null,
        [ClinicAddress]         nvarchar(50)     not null,
        [ClinicCity]            nvarchar(50)     not null,
        [ClinicState]           nchar(2)         not null,
        [ClinicPostal]          nvarchar(10)     not null,
        [ClinicPhoneNumber]     nvarchar(10)     not null,
        [ClinicPhoneExtension]  nvarchar(10)     not null,
        [ClinicFaxNumber]       nvarchar(10)     not null,
        [NumberOfVets]          int              not null,  
        [IpAddress]             nvarchar(20)     not null,
        [MailOptIn]             bit              not null,
        [EmailOptIn]            bit              not null,
        [Created]               datetime         not null,
        [Modified]              datetime         not null,
        [Deleted]               datetime         null
    );
end

if not exists(select 1 from information_schema.table_constraints where constraint_name = 'pk_registrations')
    alter table dbo.Registrations add
        constraint pk_registrations primary key nonclustered (Id);

if not exists (select 1 from sysindexes where [name] = 'ix_registrations_created')
    create clustered index ix_registrations_created
        on dbo.Registrations(Created);

if not exists (select 1 from sysindexes where [name] = 'ix_registrations_email')
    create index ix_registrations_email
        on dbo.Registrations(EmailAddress);

if not exists (select 1 from sysindexes where [name] = 'ix_registrations_email')
    create index ix_registrations_name_and_clinic
        on dbo.Registrations (FirstName,
                              LastName,
                              ClinicName);

002.sql

/**********************************************************************
  The original schema allowed null for these columns, but we don't want
  that, so update existing nulls and change the columns to disallow 
  null values
 *********************************************************************/

update dbo.Registrations set SourceA = '' where SourceA is null;
update dbo.Registrations set SourceB = '' where SourceB is null;
alter table dbo.Registrations alter column SourceA nvarchar(50) not null;
alter table dbo.Registrations alter column SourceB nvarchar(50) not null;

/**********************************************************************
  The client wanted to modify the signup form to include a fax opt-in
 *********************************************************************/

if not exists 
(
    select 1 
      from information_schema.columns
     where table_schema = 'dbo'
       and table_name   = 'Registrations'
       and column_name  = 'FaxOptIn'
)
alter table dbo.Registrations 
    add FaxOptIn bit null 
        constraint df_registrations_faxoptin default 0;

003.sql, 004.sql и т.д ...

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

6
ответ дан 1 December 2019 в 14:32
поделиться

для такого рода проблем используйте Visual studio team system 2008 для управления версиями вашей базы данных sql.

В цф нет. функции avialbe, например

  • Datacompare
  • Schemacompare
  • контроль версий

об управлении версиями базы данных: http://www.codinghorror.com/blog/2006/12/is-your-database- under-version-control.html для получения более подробной информации: http://msdn.microsoft.com/en-us/library/ms364062 (VS.80) .aspx

1
ответ дан 1 December 2019 в 14:32
поделиться

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

Самый многообещающий инструмент, о котором я читал, что он подходит под эти требования, это Liquibase.
Вот несколько дополнительных ссылок:

3
ответ дан 1 December 2019 в 14:32
поделиться

Да, вы о многом просите, но все они действительно уместны! Здесь, в Red Gate, мы движемся к полному решению для разработки баз данных с нашим расширением SSMS для управления исходным кодом SQL, и мы сталкиваемся с аналогичными проблемами.

http://www.red-gate.com/products/SQL_Source_Control/index.htm

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

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

2
ответ дан 1 December 2019 в 14:32
поделиться

Мы используем SQL Examiner для хранения схемы базы данных под контролем версий. Я также пробовал VS2010, но, на мой взгляд, подход VS слишком сложен для малых и средних проектов. С SQL Examiner я в основном работаю с SSMS и использую SQL Examiner для проверки обновлений в SVN (TFS и SourceSafe тоже поддерживаются, но я никогда не пробовал).

Вот описание подхода SQL Examiner: How to get your database under version control

1
ответ дан 1 December 2019 в 14:32
поделиться

Попробуйте DBSourceTools. (http://dbsourcetools.codeplex.com)
Она с открытым исходным кодом и специально разработана для записи всей базы данных - таблиц, представлений, процессов на диск, а затем повторного создания этой базы данных через цель развертывания.
Вы можете создавать сценарии для всех данных или просто указать, для каких таблиц создавать сценарии.
Кроме того, результаты можно упаковать в zip-архив для распространения.
Мы используем его для контроля исходного кода баз данных и для тестирования патчей обновлений для новых релизов.
В бэкенде он построен на основе SMO, и поэтому поддерживает SQL 2000, 2005 и 2008.
Интегрирован DBDiff, позволяющий проводить сравнение схем.
Приятного аппетита, - Натан.

0
ответ дан 1 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

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