Пуленепробиваемый способ DROP и СОЗДАТЬ базу данных при непрерывной интеграции - PullRequest
3 голосов
/ 17 марта 2010

Я пытаюсь удалить и воссоздать базу данных из моей настройки CI.Но мне трудно автоматизировать удаление и создание базы данных, что и следовало ожидать, учитывая сложности используемого db.Иногда процесс зависает, выдает ошибки «db is using» или просто занимает слишком много времени.Мне все равно, если БД используется, я хочу убить его и создать его снова.У кого-нибудь есть метод прямого выстрела, чтобы сделать это?в качестве альтернативы у кого-нибудь есть опыт сбрасывания всех объектов в БД вместо того, чтобы сбросить сам БД?

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

Мы используем Hudson, чтобы постоянно перестраивать промежуточные сайты для нашей команды QA. Мы уничтожаем соединения, сбрасываем базу данных, затем восстанавливаем / перестраиваем / перезаправляем БД.

Это то, что я использую для уничтожения соединений, чтобы я мог сбросить БД.

USE MASTER
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_KillDatabaseProcesses]') AND type in (N'P', N'PC'))
   DROP PROCEDURE [dbo].[sp_KillDatabaseProcesses]
GO
CREATE PROCEDURE dbo.sp_KillDatabaseProcesses(@databaseName varchar(100))     
   AS
   DECLARE @databaseId int,
           @sysProcessId int,
           @cmd varchar(1000)
   EXEC ('USE MASTER')
   SELECT @databaseId = dbid FROM master..sysdatabases
      WHERE [name] = @databaseName
   DECLARE sysProcessIdCursor CURSOR FOR
      SELECT spid FROM [master]..[sysprocesses] WHERE [dbid] = @databaseId

   OPEN sysProcessIdCursor
   FETCH NEXT FROM sysProcessIdCursor INTO @sysProcessId WHILE @@fetch_status = 0
   BEGIN
      SET @cmd = 'KILL '+ convert(nvarchar(30),@sysProcessId)
      PRINT @cmd
      EXEC(@cmd)
      FETCH NEXT FROM sysProcessIdCursor INTO @sysProcessId
   END
   DEALLOCATE sysProcessIdCursor
GO
0 голосов
/ 17 марта 2010

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

Но я немного удивлен, что ваш CI отбрасывает базу данных и создает ее в том же сценарии. Обычно CI должен развертывать базу данных, используя сценарий / методы развертывания вашей сборки, как это сделал бы клиент. Но вы не можете серьезно иметь сценарий развертывания, который удаляет базу данных при развертывании клиента. Обычно у CI есть шаг, чтобы очистить / выровнять тестовый сервер, а затем запустить процесс установки сборки, который развернет базу данных. И у вас также должна быть история для сценариев обновления, возможно, с использованием версии метаданных приложения, обновленной e step.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...