Как управлять версиями баз данных SQL Server?

У меня есть базы данных SQL Server и делаю изменения в них. В некоторых таблицах базы данных есть записи, которые запускают записи, необходимые для запуска моего приложения. Я хотел бы сделать управление версиями по базе данных и этим записям (строкам). Возможно ли это сделать и связать его с SVN-контролем версий, которые у меня есть для моего исходного кода, или есть другие решения? Я хотел бы сделать это, чтобы иметь возможность вернуться к предыдущей версии базы данных и сравнить изменения между версиями базы данных. Было бы неплохо, если бы инструменты для этого были бесплатными, с открытым исходным кодом или не очень дорогостоящими.

Моя среда - это Visual С# Express, SQL Server 2008 Express и Tortoise SVN.

Ответы

Ответ 1

Мы только что начали делать некоторые из наших проектов, и, похоже, это работает очень хорошо, для заполнения "статических" таблиц.

Наши скрипты следуют шаблону, где создается таблица temp, и затем заполняется тем, что мы хотим, чтобы реальная таблица напоминала. Здесь мы только ставим человеческие читаемые значения (т.е. Мы не включаем столбцы IDENTITY/GUID). Остальная часть script берет временную таблицу и выполняет соответствующие инструкции INSERT/UPDATE/DELETE, чтобы реальная таблица напоминала временную таблицу. Когда мы должны изменить эти "статические" данные, все, что нам нужно обновить, это совокупность таблицы temp. Это означает, что DIFFing между версиями работает так, как ожидалось, а сценарии отката просты, как получение предыдущей версии из исходного элемента управления.

Записи INSERT/UPDATE/DELETE должны записываться только один раз. На самом деле, наши скрипты немного сложнее, и перед фактическими операциями DML выполняется два набора проверок. Один набор проверяет данные таблицы temp (т.е. Мы не будем нарушать какие-либо ограничения, пытаясь сделать базу данных похожим на таблицу temp). Другие проверяют таблицу temp и целевую базу данных (то есть, что внешние ключи доступны).

Ответ 2

Поздний ответ, но, надеюсь, полезен другим читателям

Я могу предложить использовать надстройку SSMS под названием ApexSQL Source Control. Используя эту надстройку, разработчики могут легко сопоставлять объекты базы данных с исходной системой управления с помощью мастера непосредственно из SSMS. Он включает поддержку Git, TFS, Mercurial, Subversion, TFS (включая Visual Studio Online) и других систем управления версиями. Он также включает поддержку источника управления статическими данными (так что вы также можете управлять версиями).

После загрузки и установки ApexSQL Source Control просто щелкните правой кнопкой мыши базу данных, для которой требуется управление версиями, и перейдите в подменю ApexSQL Source Control в SSMS. Нажмите кнопку "Ссылка базы данных на источник управления" и выберите систему управления версиями и модель разработки базы данных, например:

введите описание изображения здесь

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

На следующем шаге вам будет предложено предоставить информацию для входа в систему управления исходным кодом:

введите описание изображения здесь

После этого просто нажмите кнопку "Готово" и появится окно "Центр действий", предлагающее объекты, которые будут переданы в репозиторий (это по умолчанию, если репозиторий пуст).

После того, как база данных была привязана к исходному элементу управления, все операции, которые могут выполняться от клиента управления версиями, будут доступны из панели "Проводник объектов". К ним относятся:

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

Вы можете прочитать эту статью для получения дополнительной информации: http://solutioncenter.apexsql.com/sql-source-control-reduce-database-development-time/

Ответ 3

В SQL Server Control 2.0 добавлена ​​поддержка статических данных, доступная в настоящее время в бета-версии. Более подробную информацию о том, как это сделать, можно найти здесь:

http://www.red-gate.com/messageboard/viewtopic.php?t=12298

Ответ 4

Существует бесплатный продукт Microsoft, называемый Мастер публикации базы данных, который вы можете использовать для script всей базы данных (схемы и данных). Это отлично подходит для моментальных снимков текущего состояния БД и позволит вам воссоздать с нуля в любой момент

Ответ 5

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

script для установки свойств выглядит следующим образом:

DECLARE @AssemblyDescription sysname
SET @AssemblyDescription = N'DailyBuild_20090322.1'

DECLARE @AssemblyFileVersion sysname
SET @AssemblyFileVersion = N'0.9.3368.58294'

-- The extended properties DatabaseDescription and DatabaseFileVersion contain the
-- AssemblyDescription and AssemblyFileVersion of the build that was used for the
-- database script that creates the database structure.
-- 
-- The current value of these properties can be displayed with the following query:
-- SELECT * FROM sys.extended_properties

IF EXISTS (SELECT * FROM sys.extended_properties WHERE class_desc = 'DATABASE' AND name = N'DatabaseDescription')
BEGIN
    EXEC sys.sp_updateextendedproperty @name = N'DatabaseDescription', @value = @AssemblyDescription
END
ELSE
BEGIN
    EXEC sys.sp_addextendedproperty @name = N'DatabaseDescription', @value = @AssemblyDescription
END

IF EXISTS (SELECT * FROM sys.extended_properties WHERE class_desc = 'DATABASE' AND name = N'DatabaseFileVersion')
BEGIN
    EXEC sys.sp_updateextendedproperty @name = N'DatabaseFileVersion', @value = @AssemblyFileVersion
END
ELSE
BEGIN
    EXEC sys.sp_addextendedproperty @name = N'DatabaseFileVersion', @value = @AssemblyFileVersion
END
GO

Ответ 6

Вы можете получить версию SQL Management Studio для SQL Server Express. Я считаю, что вы сможете использовать это для создания сценариев схемы вашей базы данных. Я думаю, это заставит вас создавать скрипты вручную для вставки начальных записей.

Затем поместите все сценарии в исходный элемент управления вместе с мастером script, который запускает отдельные скрипты в правильном порядке.

Вы сможете запускать diff с использованием windiff (бесплатно с помощью Visual Studio SDK), иначе Beyond Compare является недорогим, и большой инструмент diff/merge/sync.

Ответ 7

MS Visual Studio Team System для разработчиков баз данных имеет функциональные возможности для простого создания сценариев создания для всей схемы. Только недостаток - это стоимость!

Считаете ли вы использование SubSonic?

Ответ 8

Вы должны использовать конкретное управление версиями DB.

http://msdn.microsoft.com/en-us/library/ms189050.aspx

Когда либо READ_COMMITTED_SNAPSHOT или База данных ALLOW_SNAPSHOT_ISOLATION опции включены, логические копии (версии) поддерживаются для всех данных изменения, выполненные в база данных. Каждый раз, когда строка изменяется по конкретной сделке экземпляр хранилищ Database Engine версия ранее совершенной образ строки в tempdb. каждый версия отмечена транзакцией порядковый номер транзакции которые внесли изменения. Варианты измененные строки привязаны по ссылке список. Новейшее значение строки всегда хранятся в текущей базе данных и привязан к сохраненным версиям строк в tempdb.

Ответ 9

Я использую bcp для этого (утилита для массовой загрузки, часть стандартной установки SQL Server, включая Express Edition).

Для каждой таблицы с данными необходим файл управления Table.ctl и файл данных Table.csv (это текстовые файлы, которые могут быть созданы из существующей базы данных с помощью bcp). Как текстовые файлы, их можно легко выполнить версиями.

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

SET BASE_NAME=MyDatabaseName
SET CONNECT_STRING=.\SQLEXPRESS

FOR /R %%i IN (.) DO (
  FOR %%j IN ("%%~fi\*.ctl") DO (
    ECHO +   %%~nj
    bcp %BASE_NAME%..%%~nj in "%%~dpsj%%~nj.csv" -T -E -S %CONNECT_STRING% -f "%%~dpsj%%~nj.ctl" >"%TMP%\%%~nj.log"
    IF %ERRORLEVEL% GTR 0 (
      TYPE "%TMP%\%%~nj.log"
      GOTO ERROR_USAGE
    )
  )
)

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

Ответ 10

Этот проект имеет хороший пример развертывания и отката