我试图从我的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;
我们一直使用Hudson来为我们的质量检查小组重建临时站点。我们终止连接,删除数据库,然后还原/重建/迁移数据库。
这是我用来终止连接的工具,因此我可以删除数据库。
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