2010-03-17 13 views
3

我試圖從CI配置中刪除並重新創建數據庫。但是我發現很難自動化數據庫的刪除和創建,鑑於正在使用的數據庫的複雜性,這是預料之中的。有時候,進程會掛起,「db目前正在使用」錯誤或者需要很長時間。我不在乎數據庫是否在使用,我想殺死它並重新創建它。是否有人有直接拍攝的方法來做到這一點?或者任何人都有經驗放棄所有對象的數據庫而不是刪除數據庫本身?在持續集成下刪除並創建數據庫的防彈方法

USE master 

--Create a database 
IF EXISTS(SELECT name FROM sys.databases 
    WHERE name = 'mydb') 
BEGIN 
ALTER DATABASE mydb 
SET SINGLE_USER --or RESTRICTED_USER 
--WITH ROLLBACK IMMEDIATE 
    DROP DATABASE uAbraham_MapSifterAuthority 
END 

CREATE DATABASE mydb; 
+1

我正在投票將其移至ServerFault。雖然您是出於與編程相關的原因來做這件事,但您要求的內容將由專業DBA更好地回答,因爲過去不得不修改實時數據庫。 –

+4

作爲一個CI構建過程的問題,我認爲這裏更適合於SO –

回答

2

我們使用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

使用回滾立即設置單個用戶是在落下之前踢出每個人的典型方式。

但是我對你的CI刪除DB並在相同的腳本中創建它感到有些驚訝。正常情況下,CI應該使用部署腳本/方法來構建可交付的數據庫,就像客戶會這樣做,會部署數據庫。但是你不能認真地有一個部署腳本在客戶部署上丟棄了數據庫。通常,CI有一個清理/壓扁測試服務器的步驟,然後運行構建可交付設置過程,該過程將部署數據庫。而且您還應該有升級方案的故事,可能使用application metadata version upgrad e步驟。