Версионирование базы данных SQL Server

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

Я'всегда хочу иметь там хотя бы некоторые данные (как упоминает alumb: типы пользователей и администраторов). Мне также часто нужна большая коллекция сгенерированных тестовых данных для измерения производительности.

Комментарии к вопросу (1)
Решение

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

Для веб-приложения, где у меня будет один экземпляр производственной базы данных, я использую две техники:

Сценарии обновления базы данных

Последовательные сценарии обновления базы данных, содержащие DDL, необходимые для переноса схемы с версии N на N+1. (Они помещаются в вашу систему контроля версий.) Таблица _versionhistory, что-то вроде

create table VersionHistory (
    Version int primary key,
    UpgradeStart datetime not null,
    UpgradeEnd datetime
    );

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

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

Синхронизация песочницы разработчика

  1. Сценарий для резервного копирования, санации и сокращения производственной базы данных. Выполняйте его после каждого обновления производственной БД.
  2. Сценарий для восстановления (и корректировки, если необходимо) резервной копии на рабочей станции разработчика. Каждый разработчик запускает этот сценарий после каждого обновления производственной БД.

Оговорка: мои автоматизированные тесты выполняются на базе данных с правильной схемой, но пустой, поэтому эти советы не будут идеально соответствовать вашим потребностям.

Комментарии (8)

Красный Gate' s SQL Выдерживают сравнение, продукт не только позволяет Вам делать сравнения уровня объекта и производить сценарии изменения от этого, но он также позволяет Вам экспортировать свои объекты базы данных в иерархию папки, организованную типом объекта с одним [objectname] .sql сценарий создания за объект в этих справочниках. Иерархия типа объекта похожа на это:

\Functions
\Security
\Security\Roles
\Security\Schemas
\Security\Users
Процедуры \Stored
\Tables

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

Комментарии (1)

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

Если вам нужно хранить только структуру базы данных, а не данные, вы можете экспортировать базу данных в виде SQL-запросов. (в Enterprise Manager: > Генерировать SQL-скрипт. Я рекомендую установить опцию "создавать один файл для каждого объекта" на вкладке опций). Затем вы можете зафиксировать эти текстовые файлы в svn и использовать функции svn'diff и logging.

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

Если вам нужно сохранить все данные, я рекомендую сохранить резервную копию базы данных и использовать продукты Redgate (http://www.red-gate.com/) для проведения сравнений. Они не дешевы, но стоят каждого пенни.

Комментарии (3)

Во-первых, Вы должны выбрать систему управления вариантов, которая является правильной для Вас:

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

  • Распределенная Система управления Вариантов - система, где хранилище клонируется, и каждый клон, является на самом деле полной резервной копией хранилища, поэтому если какой-либо сервер терпит крах, то любое клонированное хранилище может использоваться, чтобы восстановить его После выбора правильной системы для Ваших потребностей, you' ll нужно к установке хранилище, которое является ядром каждой системы управления вариантов Все это объяснено в следующей статье: http://solutioncenter.apexsql.com/sql-server-source-control-part-i-understanding-source-control-basics/

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

Комментарии (0)

Здесь у Красных Ворот мы предлагаем инструмент, Исходный Контроль SQL, который использует SQL, Сравнивают технологию, чтобы связать Вашу базу данных с TFS или хранилищем SVN. Этот инструмент объединяется в SSMS и позволяет Вам работать, как Вы обычно были бы, кроме него теперь позволяет Вам передать объекты.

Для основанного на миграциях подхода (более подходящий для автоматизированного развертывания), мы предлагаем Автоматизацию Изменения SQL (раньше названный ReadyRoll), который создает и управляет рядом возрастающих сценариев как Визуальный проект Студии.

В Исходном Контроле SQL возможно определить статические таблицы данных. Они сохранены в исходном контроле как заявления ВСТАВКИ.

Если you' ре, говорящее о данных испытаний, we' d рекомендуют, чтобы Вы или произвели данные испытаний с инструментом или с помощью сценария постразвертывания, который Вы определяете, или Вы просто вернули производственную резервную копию dev окружающей среде.

Комментарии (4)

Вы могли бы хотеть посмотреть на Liquibase (http://www.liquibase.org/). Даже если Вы don' t используют сам инструмент, он обращается с понятием управления изменениями базы данных или рефакторинга вполне прилично.

Комментарии (2)

+1 для всех who' s рекомендовал инструменты RedGate с дополнительной рекомендацией и протестом.

У SqlCompare также есть прилично зарегистрированный API: таким образом, Вы можете, например, написать приложение пульта, которое синхронизирует Вашу управляемую источником папку сценариев с базой данных тестирования интеграции CI по регистрации, так, чтобы, когда кто-то регистрируется в изменении схемы от их папки сценариев it' s автоматически развернутый наряду с соответствующим изменением кода программы. Это помогает преодолеть разрыв с разработчиками, которые забывчивы о размножении изменений в их местном db до общей DB развития (приблизительно половина из нас, я думаю:)).

Протест состоит в том, что с подготовленным решением или иначе, инструменты RedGate достаточно гладкие это it' s легкий забыть о фактах SQL, лежащих в основе абстракции. Если Вы переименовываете все колонки в столе, SqlCompare не имеет никакого способа нанести на карту старые колонки к новым колонкам и пропустит все данные в столе. Это произведет предупреждения, но I' ve замеченные люди щелкают мимо этого. There' s общий пункт, который здесь стоит сделать, я думаю, что Вы можете только автоматизировать управление версиями DB и модернизировать до сих пор - абстракции очень прохудившиеся.

Комментарии (2)

Мы используем DBGhost, чтобы управлять нашей базой данных SQL. Тогда Вы помещаете свои сценарии, чтобы построить новую базу данных в Вашем контроле вариантов и it' ll или строят новую базу данных или модернизируют любую существующую базу данных до схемы в контроле вариантов. Тем путем Вы don' t должны волноваться о создании сценариев изменения (хотя Вы можете все еще сделать это, если, например, Вы хотите изменить тип данных колонки и потребности преобразовать данные).

Комментарии (1)

С ПРОТИВ 2010, используйте проект Базы данных.

  1. Сценарий Ваша база данных
  2. Внесите изменения в сценарии или непосредственно на Ваш db сервер
  3. Синхронизируйте Данные об использовании > Схема выдерживает сравнение

Делает прекрасное решение для управления версиями DB и делает синхронизацию DB' s бриз.

Комментарии (1)

Это - хороший подход, чтобы сохранить сценарии базы данных в контроль вариантов со сценариями изменения так, чтобы Вы могли модернизировать любую базу данных, которую Вы имеете. Также Вы могли бы хотеть сохранить схемы для различных версий так, чтобы Вы могли создать полную базу данных, не имея необходимость применять все сценарии изменения. Обработка сценариев должна быть автоматизирована так, чтобы Вы don' t должны сделать физический труд.

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

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

Комментарии (0)

Вы могли также посмотреть на решение для миграций. Они позволяют Вам определять свою схему базы данных в кодексе C# и катить Вашу версию базы данных вверх и вниз по использованию MSBuild.

I' m, в настоящее время используя DbUp и it' s работа хорошо.

Комментарии (0)

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

Миграции программно определяют преобразования базы данных, используя Ruby DSL; каждое преобразование может быть применено или (обычно) откатано, что позволяет вам перейти к другой версии схемы БД в любой момент времени. Файл, определяющий эти преобразования, можно проверить в системе контроля версий, как и любой другой кусок исходного кода.

Поскольку миграции являются частью ActiveRecord, они обычно находят применение в полнофункциональных приложениях Rails; однако вы можете использовать ActiveRecord независимо от Rails с минимальными усилиями. Более подробное описание использования миграций AR вне Rails смотрите здесь.

Комментарии (0)

Каждая база данных должна находиться под контролем исходного кода. То, чему недостает, является инструментом к автоматически сценарию все объекты базы данных - и " конфигурация data" - к файлу, который тогда может быть добавлен к любой исходной системе управления. Если Вы используете SQL-сервер, то мое решение здесь: http://dbsourcetools.codeplex.com/. Весело провести время.

  • Натан.
Комментарии (0)

It' s простой.

  1. Когда основной проект готов тогда, Вы должны создать полный сценарий базы данных. Этот сценарий предан SVN. Это - первая версия.

  2. После этого все разработчики создают сценарии изменения (ИЗМЕНИТЕСЬ..., новые столы, sprocs, и т.д.).

  3. Когда Вам нужна текущая версия тогда, Вы должны выполнить все новые сценарии изменения.

  4. Когда приложение опубликовано к производству тогда, Вы возвращаетесь к 1 (но тогда это будет последовательная версия, конечно).

Nant поможет Вам выполнить те сценарии изменения.:)

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

Комментарии (1)

Сделать свалку к системе управления исходного кода, что немного быстрее, Вы видите, какие объекты изменились с прошлого раза при помощи информации о версии в sysobjects.

Установка: Составьте таблицу в каждой базе данных, которую Вы хотите проверить с приращением, чтобы содержать информацию вариантов с прошлого раза, когда Вы проверили его (пустой на первом показе). Очистите этот стол, если Вы хотите повторно просмотреть свою целую структуру данных.

IF ISNULL(OBJECT_ID('last_run_sysversions'), 0)  0 DROP TABLE last_run_sysversions
CREATE TABLE last_run_sysversions (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

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

IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0)  0 DROP TABLE #tmp
CREATE TABLE #tmp (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

SET NOCOUNT ON

-- Insert the values from the end of the last run into #tmp
INSERT #tmp (name, id, base_schema_ver, schema_ver, type) 
SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions

DELETE last_run_sysversions
INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects

-- This next bit lists all differences to scripts.
SET NOCOUNT OFF

--Renamed.
SELECT 'renamed' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE o.name  t.name /*COLLATE*/
AND o.type IN ('TR', 'P' ,'U' ,'V')
UNION 

--Changed (using alter)
SELECT 'changed' AS ChangeType, o.name /*COLLATE*/, 
       'altered' AS extra_info, 2 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id 
WHERE (
   o.base_schema_ver  t.base_schema_ver
OR o.schema_ver       t.schema_ver
)
AND  o.type IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT oi.name 
         FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
         WHERE oi.name  ti.name /*COLLATE*/
         AND oi.type IN ('TR', 'P' ,'U' ,'V')) 
UNION

--Changed (actually dropped and recreated [but not renamed])
SELECT 'changed' AS ChangeType, t.name, 'dropped' AS extra_info, 2 AS Priority
FROM #tmp t
WHERE    t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
AND  t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Deleted
SELECT 'deleted' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM sysobjects o
                  WHERE o.id = t.id)
AND t.name NOT IN (  SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Added
SELECT 'added' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
FROM sysobjects o
WHERE NOT EXISTS (SELECT * FROM #tmp t
                  WHERE o.id = t.id)
AND      o.type  IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
ORDER BY Priority ASC

Примечание: , Если Вы будете использовать нестандартное сопоставление в какой-либо из Ваших баз данных, Вы должны будете заменить '/ СОПОСТАВЛЯЮТ /' с Вашим сопоставлением базы данных. т.е. 'СОПОСТАВЛЯЮТ Latin1_General_CI_AI'

Комментарии (1)

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

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

[1]: http://weblogs.asp.net/jgalloway/archive/2006/10/28/Batch-files-to-check-SQL-2005-_ 2800_MDF2900 файлы в и источника подрывной деятельности control.aspx

Комментарии (0)

Поскольку наше приложение должно работать через несколько RDBMSs, мы храним наше определение схемы в контроле вариантов, используя нейтральное в отношении базы данных Крутящий момент формат (XML). Мы также контроль вариантов справочные данные для нашей базы данных в XML форматируем следующим образом (где " Relationship" один из справочных столов):



  etc.

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

Комментарии (0)

Я написал это приложение только что, http://sqlschemasourcectrl.codeplex.com/, который просмотрит Ваш MSFT SQL db' s так часто, как Вы хотите и автоматически сваливаете свои объекты (столы, взгляды, procs, функции, sql параметры настройки) в SVN. Работы как очарование. Я использую его с Неопьянением (который позволяет мне получать тревоги на checkins),

Комментарии (0)

У нас была потребность к версии наша база данных SQL после того, как мы мигрировали на x64 платформу, и наша старая версия порвала с миграцией. Мы написали применение C#, которое использовало SQLDMO, чтобы планировать все объекты SQL к папке:

< pre> Корень ServerName DatabaseName Объекты схемы Спусковые механизмы базы данных* < name> .ddltrigger.sql Функции < schema>.< name> .function.sql Безопасность Роли Прикладные роли < name> .approle.sql Роли базы данных < name> .role.sql Схемы* < name> .schema.sql Пользователи < name> .user.sql Хранение Полные текстовые каталоги* < name> .fulltext.sql Хранимые процедуры < schema>.< name> .proc.sql Синонимы* < name> .synonym.sql Столы < schema>.< name> .table.sql Ограничения < schema>.< tablename>.< name> .chkconst.sql < schema>.< tablename>.< name> .defconst.sql Индексы < schema>.< tablename>.< name> .index.sql Ключи < schema>.< tablename>.< name> .fkey.sql < schema>.< tablename>.< name> .pkey.sql < schema>.< tablename>.< name> .ukey.sql Спусковые механизмы < schema>.< tablename>.< name> .trigger.sql Типы Определенные пользователями типы данных < schema>.< name> .uddt.sql Коллекции схем XML* < schema>.< name> .xmlschema.sql Взгляды < schema>.< name> .view.sql Индексы < schema>.< viewname>.< name> .index.sql Спусковые механизмы < schema>.< viewname>.< name> .trigger.sql Применение тогда сравнило бы недавно письменную версию с версией, сохраненной в SVN и если бы были различия, это обновило бы SVN. Мы решили, что, управляя процессом, как только ночь была достаточна, так как мы не делаем это многими изменениями SQL. Это позволяет нам отслеживать изменения всех объектов, о которых мы заботимся плюс он, позволяет нам восстанавливать нашу полную схему в случае серьезной проблемы.
Комментарии (1)

Мы don' t хранят схему базы данных, мы храним изменения базы данных. То, что мы делаем, сохранить изменения схемы так, чтобы мы построили сценарий изменения для любой версии базы данных и применили его к нашему customer' s базы данных. Я написал сервисное приложение базы данных, которое распределено с нашим главным заявлением, которое может прочитать тот сценарий и знать, какие обновления должны быть применены. У этого также есть достаточно ума, чтобы освежить взгляды и хранимые процедуры по мере необходимости.

Комментарии (0)