Answers:
如果要删除数据库,则必须是该数据库的唯一连接。如果还有其他连接,则无法删除。根据错误消息(该错误表示您的数据库处于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
如果尝试访问已处于单用户模式的数据库,则需要先关闭与该数据库的所有连接,否则将收到错误消息:
消息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
ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATE
如迈克的答案所示,将所有用户赶走,更容易使用。