Wie kann man alle aktuellen Verbindungen zu einer SQL Server 2005-Datenbank beenden?

Ich möchte eine Datenbank umbenennen, erhalte aber immer wieder die Fehlermeldung 'couldn't get exclusive lock' auf die Datenbank, was bedeutet, dass noch eine oder mehrere Verbindungen aktiv sind.

Wie kann ich alle Verbindungen zur Datenbank beenden, so dass ich sie umbenennen kann?

Lösung

Siehe Alle aktiven Verbindungen zu einer Datenbank beenden.

Der Grund, warum der von [Adam vorgeschlagene] Ansatz (https://stackoverflow.com/questions/11620/how-do-you-kill-all-current-connections-to-a-sql-server-2005-database/11627#11627) nicht funktioniert, ist, dass in der Zeit, in der Sie die aktiven Verbindungen in einer Schleife durchgehen, neue Verbindungen aufgebaut werden können, die Sie dann verpassen. Der Artikel, den ich verlinkt habe, verwendet den folgenden Ansatz, der diesen Nachteil nicht hat:

-- 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
Kommentare (6)

Skript, um dies zu erreichen, ersetzen Sie 'DB_NAME' durch die Datenbank, zu der alle Verbindungen abgebrochen werden sollen:

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
Kommentare (4)

Klicken Sie in MS SQL Server Management Studio im Objekt-Explorer mit der rechten Maustaste auf die Datenbank. Wählen Sie im folgenden Kontextmenü 'Tasks -> Offline nehmen'

Kommentare (1)