Управление версиями базы данных SQL Server - PullRequest
301 голосов
/ 01 августа 2008

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

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

Ответы [ 29 ]

12 голосов
/ 07 августа 2008

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

Я сейчас использую DbUp , и он работает хорошо.

11 голосов
/ 02 августа 2008

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

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

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

10 голосов
/ 07 июля 2009

Каждая база данных должна находиться под контролем исходного кода. Чего не хватает, так это инструмента для автоматического сценария всех объектов базы данных - и «данных конфигурации» - в файл, который затем можно добавить в любую систему контроля версий. Если вы используете SQL Server, то мое решение здесь: http://dbsourcetools.codeplex.com/. Повеселись. - Натан.

9 голосов
/ 16 мая 2009

Все просто.

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

  2. После этого все разработчики создают сценарии изменений (ALTER ..., новые таблицы, sprocs и т. Д.).

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

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

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

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

8 голосов
/ 24 сентября 2008

Поскольку наше приложение должно работать в нескольких РСУБД, мы сохраняем определение нашей схемы в управлении версиями, используя нейтральный к базе данных формат Torque (XML). Мы также контролируем версию справочных данных для нашей базы данных в формате XML следующим образом (где «Отношение» является одной из справочных таблиц):

  <Relationship RelationshipID="1" InternalName="Manager"/>
  <Relationship RelationshipID="2" InternalName="Delegate"/>
  etc.

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

8 голосов
/ 08 августа 2008

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

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

8 голосов
/ 24 сентября 2008

Чтобы сделать дамп в систему управления исходным кодом немного быстрее, вы можете увидеть, какие объекты изменились с прошлого раза, используя информацию о версии в 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 только для тех, которые вас интересуют, и поместить их в систему управления исходным кодом по вашему выбору.

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

Примечание: Если вы используете нестандартное сопоставление в любой из ваших баз данных, вам необходимо заменить /* COLLATE */ на сопоставление вашей базы данных. т.е. COLLATE Latin1_General_CI_AI

7 голосов
/ 09 октября 2008

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

                Root
                    ServerName
                       DatabaseName
                          Schema Objects
                             Database Triggers*
                                .ddltrigger.sql
                             Functions
                                ..function.sql
                             Security
                                Roles
                                   Application Roles
                                      .approle.sql
                                   Database Roles
                                      .role.sql
                                Schemas*
                                   .schema.sql
                                Users
                                   .user.sql
                             Storage
                                Full Text Catalogs*
                                   .fulltext.sql
                             Stored Procedures
                                ..proc.sql
                             Synonyms*
                                .synonym.sql
                             Tables
                                ..table.sql
                                Constraints
                                   ...chkconst.sql
                                   ...defconst.sql
                                Indexes
                                   ...index.sql
                                Keys
                                   ...fkey.sql
                                   ...pkey.sql
                                   ...ukey.sql
                                Triggers
                                   ...trigger.sql
                             Types
                                User-defined Data Types
                                   ..uddt.sql
                                XML Schema Collections*
                                   ..xmlschema.sql
                             Views
                                ..view.sql
                                Indexes
                                   ...index.sql
                                Triggers
                                   ...trigger.sql

Затем приложение сравнивает вновь написанную версию с версией, хранящейся в SVN, и при наличии различий оно обновляет SVN. Мы определили, что запуск процесса один раз в ночь был достаточным, поскольку мы не вносили столько изменений в SQL. Это позволяет нам отслеживать изменения во всех объектах, которые нас интересуют, а также позволяет перестраивать нашу полную схему в случае серьезной проблемы.

7 голосов
/ 07 августа 2008

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

7 голосов
/ 23 сентября 2010

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

...