我想重命名一个数据库,但不断得到“无法获得数据库上的排他锁”的错误,这意味着仍有一些连接处于活动状态。
如何杀死数据库的所有连接以便重命名它?
我想重命名一个数据库,但不断得到“无法获得数据库上的排他锁”的错误,这意味着仍有一些连接处于活动状态。
如何杀死数据库的所有连接以便重命名它?
当前回答
Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'
Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((
select ' ' + KillCommand from #temp
FOR XML PATH('')),1,1,'')
Execute sp_executesql @query
Drop table #temp
使用'master'数据库并运行此查询,它将杀死数据库中的所有活动连接。
其他回答
我总是用:
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
另一种“以身作则”的方法是重新启动MSSQLSERVER服务。 我喜欢从命令行做一些事情。把它粘贴到CMD中就可以了: Net stop mssqlserver & Net start mssqlserver
或者开放“服务”。找到“SQL Server (MSSQLSERVER)”,单击右键,选择“restart”。
这将“肯定,肯定”杀死该实例上运行的所有数据库的所有连接。
(比起许多在服务器/数据库上反复更改配置的方法,我更喜欢这种方法)
使用SQL Management Studio Express:
在对象资源管理器树中,在管理下向下钻到“活动监视器”(如果你在那里找不到它,那么右键单击数据库服务器并选择“活动监视器”)。打开活动监视器,您可以查看所有进程信息。您应该能够找到您感兴趣的数据库的锁并关闭这些锁,这也将关闭连接。
您应该能够在此之后重命名。
在这种情况下,适合我的选项如下:
在相关数据库上启动“Detach”操作。这将打开一个窗口(在SQL 2005中),显示阻止对DB执行操作的活动连接。 终止活动连接,取消分离操作。 现在应该可以恢复数据库了。
脚本来完成这个任务,用数据库替换'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