我正在SQL Server 2008中对我的架构进行主动开发,并且经常要重新运行我的drop / create数据库脚本。我跑的时候
USE [master]
GO
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'MyDatabase')
DROP DATABASE [MyDatabase]
GO
我经常收到此错误
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "MyDatabase" because it is currently in use.
如果右键单击对象资源管理器窗格中的数据库并从上下文菜单中选择“删除”任务,则会出现一个“关闭现有连接”的复选框
有没有办法在我的脚本中指定此选项?
答案 0 :(得分:226)
您可以断开所有人的连接,并通过以下方式回滚他们的交易:
alter database [MyDatbase] set single_user with rollback immediate
之后,您可以安全地删除数据库:)
答案 1 :(得分:35)
转到管理工作室并执行您描述的所有操作,而不是单击“确定”,然后单击“脚本”。它将显示它将运行的代码,然后您可以将其合并到脚本中。
在这种情况下,您需要:
ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
答案 2 :(得分:15)
根据ALTER DATABASE SET文档,仍有可能在将数据库设置为SINGLE_USER模式后,您将无法访问该数据库:
在将数据库设置为SINGLE_USER之前,请确认AUTO_UPDATE_STATISTICS_ASYNC选项设置为OFF。设置为ON时,用于更新统计信息的后台线程将与数据库建立连接,并且您将无法以单用户模式访问数据库。
因此,使用现有连接删除数据库的完整脚本可能如下所示:
DECLARE @dbId int
DECLARE @isStatAsyncOn bit
DECLARE @jobId int
DECLARE @sqlString nvarchar(500)
SELECT @dbId = database_id,
@isStatAsyncOn = is_auto_update_stats_async_on
FROM sys.databases
WHERE name = 'db_name'
IF @isStatAsyncOn = 1
BEGIN
ALTER DATABASE [db_name] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
-- kill running jobs
DECLARE jobsCursor CURSOR FOR
SELECT job_id
FROM sys.dm_exec_background_job_queue
WHERE database_id = @dbId
OPEN jobsCursor
FETCH NEXT FROM jobsCursor INTO @jobId
WHILE @@FETCH_STATUS = 0
BEGIN
set @sqlString = 'KILL STATS JOB ' + STR(@jobId)
EXECUTE sp_executesql @sqlString
FETCH NEXT FROM jobsCursor INTO @jobId
END
CLOSE jobsCursor
DEALLOCATE jobsCursor
END
ALTER DATABASE [db_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [db_name]
答案 3 :(得分:2)
我尝试了hgmnz在SQL Server 2012上所说的内容。
管理层创建给我:
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'MyDataBase'
GO
USE [master]
GO
/****** Object: Database [MyDataBase] Script Date: 09/09/2014 15:58:46 ******/
DROP DATABASE [MyDataBase]
GO
答案 4 :(得分:2)
我知道现在为时已晚,但可能对某人有所帮助。使用它使数据库脱机
ALTER DATABASE dbname SET OFFLINE
答案 5 :(得分:0)
尝试使用此C#代码删除数据库
公共静态void DropDatabases(字符串数据库) {
string sql = "ALTER DATABASE " + dataBase + "SET SINGLE_USER WITH ROLLBACK IMMEDIATE" ;
using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["DBRestore"].ConnectionString))
{
connection.Open();
using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
command.CommandTimeout = 7200;
command.ExecuteNonQuery();
}
sql = "DROP DATABASE " + dataBase;
using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
command.CommandTimeout = 7200;
command.ExecuteNonQuery();
}
}
}