一尘不染

在持续集成下删除和创建数据库的防弹方式

sql

我试图从我的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;

阅读 211

收藏
2021-03-08

共1个答案

一尘不染

我们一直使用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
2021-03-08