gpt4 book ai didi

sql - 在持续集成下删除和创建数据库的可靠方法

转载 作者:搜寻专家 更新时间:2023-10-30 19:49:49 25 4
gpt4 key购买 nike

我正在尝试从我的 CI 设置中删除并重新创建一个数据库。但是我发现很难自动删除和创建数据库,考虑到正在使用的数据库的复杂性,这是可以预料的。有时进程会挂起,出现“数据库当前正在使用中”的错误,或者只是花费的时间太长。我不在乎数据库是否在使用中,我想杀死它并重新创建它。有人有直接的方法来做到这一点吗?或者,有没有人有过删除数据库中所有对象而不是删除数据库本身的经验?

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 为我们的 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

关于sql - 在持续集成下删除和创建数据库的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2463680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com