如何在单用户模式下删除数据库


12

如何删除显示DatabaseName (Single User)为名称的数据库?

当我尝试将其删除时,出现以下错误:

更改数据库“ DatabaseName”失败。(Microsoft.SqlServer.Smo)

ALTER DATABASE语句失败。(Microsoft SQL Server,错误:5064)

我尝试执行ALTER以下命令,但仍然遇到相同的问题。

ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT

Answers:


23

如果要删除数据库,则必须是该数据库的唯一连接。如果还有其他连接,则无法删除。根据错误消息(该错误表示您的数据库处于Single_User模式,但已经存在连接,因此无法连接),我的假设是您试图将其设置为Single_User模式,然后尝试执行删除操作,但是您要么抓住了一个您不知道或其他过程知道的连接。重新启动SSMS对您有用的事实告诉我,可能是您在抓住该连接。因此,这是解决问题的方法。

从逻辑上讲,您必须将数据库重新设置为多用户模式,以便随后可以将其再次设置为单用户模式(但是这次您将控制允许的单个连接,并在其他连接之前删除数据库),然后数据库将不见了。

在代码中,这是您需要执行的操作(但首先请关闭与该数据库连接的查询窗口。重新启动SSMS并确保未在对象浏览器中选择此数据库):

-- Then attempt to take your database to multi_user mode, do this from master
USE MASTER 
GO

ALTER DATABASE myDatabaseName 
SET multi_user WITH ROLLBACK IMMEDIATE
GO

-- Now put it into single_user mode and drop it. Use Rollback Immediate to disconnect any sessions and rollback their transactions. Safe since you are about to drop the DB.
ALTER DATABASE myDatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE myDatabaseName
GO

如果数据库已经处于“单用户”模式,并且您尝试从其他连接访问它,则此解决方案将不起作用。
Maxim Paukov 2012年

4
没错,Maxim-这就是为什么我说基于提供的信息和OP的自我回答在这里所做的假设实际上是具有通过对象资源管理器或查询窗口打开的连接的假设。其他用户,那么您将不得不找到一个偷走了允许的单个连接的连接,然后终止该连接的会话,并按照上面概述的步骤进行操作。–
Mike Walsh

13

如果尝试访问已处于单用户模式的数据库,则需要先关闭与该数据库的所有连接,否则将收到错误消息:

消息5064,级别16,状态1,行1目前无法更改数据库'DatabaseName'的状态或选项。数据库处于单用户模式,并且当前有用户连接到该数据库。消息5069,级别16,状态1,行1的ALTER DATABASE语句失败。

下面的查询杀死访问数据库的过程:

-- Create the sql to kill the active database connections  
declare @execSql varchar(1000), @databaseName varchar(100)  
-- Set the database name for which to kill the connections  
set @databaseName = 'DatabaseName'  

set @execSql = ''   
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '  
from    master.dbo.sysprocesses  
where   db_name(dbid) = @databaseName  
     and  
     DBID <> 0  
     and  
     spid <> @@spid  
exec(@execSql)
GO

然后,您应该能够照常将数据库恢复为多用户模式:

ALTER DATABASE 'DatabaseName' SET MULTI_USER

2
这是一个非常非常繁琐的解决方案,等同于在繁忙的系统上进行令人沮丧的重击游戏。ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATE如迈克的答案所示,将所有用户赶走,更容易使用。
亚伦·伯特兰

1
如果数据库已经处于“单用户”模式,并且您尝试从其他连接访问它,则@AaronBertrand Mike的解决方案将无法工作。
Maxim Paukov 2012年

2
是的,如果是这样,他将不得不按照您概述的方式查找会议。但是,如果将数据库设置为single_user的连接是他自己的...
Aaron Bertrand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.