Как убить все текущие соединения с базой данных 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:

В дереве Object Explorer в разделе Управление выберите "Activity Monitor" (если вы не можете найти его там,то щелкните правой кнопкой мыши на сервере базы данных и выберите "Activity Monitor").Открыв "Монитор активности",вы сможете просмотреть всю информацию о процессе.Вы сможете найти замки для интересующей Вас базы данных и отключить их,что также приведет к прерыванию соединения.

После этого ты сможешь переименоваться.




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