如何杀死所有当前连接到SQL Server 2005数据库的连接?

sql-server sql-server-2005


我想重命名一个数据库,但一直收到 "无法获得数据库的独占锁 "的错误信息,这意味着有一些连接仍然处于活动状态。

如何杀死所有与数据库的连接,以便重新命名?




Answer 1 SQLMenace


亚当建议的方法行不通的原因是,当您在活动连接上循环时,可以建立新的连接,而您会错过这些连接。您可以改用以下方法,但没有此缺点:

-- set your current connection to use master otherwise you might get an error

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER



Answer 2 Adam


脚本来实现这一点,将'DB_NAME'替换为要杀死所有连接的数据库。

USE master
GO

SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''

Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)

IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END



Answer 3 btk


杀了它,用火烧死它。

USE master
go

DECLARE @dbname sysname
SET @dbname = 'yourdbname'

DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END



Answer 4 Joseph Daigle


使用SQL Management Studio Express。

在 "对象资源管理器 "树中,在 "管理 "下钻到 "活动监视器"(如果在那里找不到,那么右击数据库服务器,选择 "活动监视器")。打开 "活动监控",你可以查看所有的进程信息。你应该可以找到你感兴趣的数据库的锁,并杀死这些锁,这也将杀死连接。

之后应该就可以重命名了。




Answer 5 brendan


我一直在用。


ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go 
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user 
GO