如何在sql脚本中指定“关闭现有连接”

如何在sql脚本中指定“关闭现有连接”

问题描述:

我在SQL Server 2008中的模式上进行了有效的开发,并且经常要重新运行我的drop/create数据库脚本。如果你正好在对象资源管理器窗格中的数据库上单击,然后从上下文菜单中删除任务,当我运行如何在sql脚本中指定“关闭现有连接”

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. 

,有一个复选框,其中“关闭现有连接”

有没有方法在脚本中指定此选项?

可以断开每个人都和回滚他们的交易有:

alter database [MyDatbase] set single_user with rollback immediate 

之后,您可以安全地删除数据库:)

+4

我用这个,但如果有机会的其他用户能够得到“单用户”窗口经常在想 - 这可能吗?可能的替代方法是ALTER DATABASE [MyDatabaseName] SET OFFLINE WITH ROLLBACK IMMEDIATE – Kristen 2009-11-10 23:04:19

+7

single_user中的用户是你;除非您在设置单用户模式后断开连接。然后一(1)个其他用户可以登录。 – Andomar 2009-11-10 23:08:32

+0

谢谢;说得通。 – Kristen 2009-11-10 23:19:51

转到管理工作室,做你所描述的一切,而不是只点击确定,点击脚本。它将显示它将运行的代码,然后将其纳入脚本中。

在这种情况下,你想:

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
+1

我是布莱恩g尝试通过完全描述你所描述的内容来回答这个问题(编写“删除数据库”对话框的脚本),但是如果你选中“关闭现有连接”复选框,**不会将ALTER DATABASE行添加到脚本中。 – 2009-11-10 23:03:16

+0

从向导生成的脚本为我包括'alter database'行。 – nick 2009-11-10 23:56:21

+0

奇怪。哪个Management Studio版本?我在2008年x64。 – 2009-11-11 00:25:48

按照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] 

我tryed SQL Server上什么hgmnz SAIDS 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 
+3

这将不会关闭活动连接。 – Jens 2016-08-11 14:06:11

+0

确保您选中了“关闭现有连接”;如果你不包含'ROLLBACK IMMEDIATE'语句将被包括在内。 “sp_delete_database_backuphistory”来自检查“删除数据库的备份和还原历史信息”。 – 2017-01-30 05:58:40

+0

如果没有当前连接关闭,则检查“关闭现有连接”不会生成“ALTER DATABASE SET SINGLE_USER ...”。 – ahwm 2018-02-23 17:34:39

我知道这太晚了,但可能是它帮助某人。使用这把你的数据库脱机

ALTER DATABASE dbname SET OFFLINE