Antworten:
Der Grund, warum der von Adam vorgeschlagene Ansatz nicht funktioniert, ist, dass während der Zeit, in der Sie die aktiven Verbindungen durchlaufen, eine neue hergestellt werden kann und Sie diese vermissen werden. Sie können stattdessen den folgenden Ansatz verwenden, der diesen Nachteil nicht aufweist:
-- 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
Um dies zu erreichen, ersetzen Sie 'DB_NAME' durch die Datenbank, um alle Verbindungen zu beenden:
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
and spid <> @@SPID
der SELECT @sKillConnection
Anweisung hinzu , damit nicht versucht wurde, meine aktuelle Verbindung zu beenden, was zu einer Fehlermeldung führen würde.
Töte es und töte es mit Feuer:
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
Verwenden von SQL Management Studio Express:
Klicken Sie in der Baumstruktur des Objekt-Explorers unter Verwaltung auf "Aktivitätsmonitor" (wenn Sie ihn dort nicht finden, klicken Sie mit der rechten Maustaste auf den Datenbankserver und wählen Sie "Aktivitätsmonitor" aus). Durch Öffnen des Aktivitätsmonitors können Sie alle Prozessinformationen anzeigen. Sie sollten in der Lage sein, die Sperren für die Datenbank zu finden, an der Sie interessiert sind, und diese Sperren aufzuheben, wodurch auch die Verbindung unterbrochen wird.
Danach sollten Sie umbenennen können.
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE [Test]
SET ONLINE
Offline zu nehmen dauert eine Weile und manchmal habe ich Probleme damit ..
Meiner Meinung nach der solideste Weg:
Trennen Klicken Sie mit der rechten Maustaste auf DB -> Aufgaben -> Trennen ... aktivieren Sie "Verbindungen trennen"
Erneutes Anhängen Klicken Sie mit der rechten Maustaste auf Datenbanken -> Anhängen .. Hinzufügen ... -> wählen Sie Ihre Datenbank aus und ändern Sie die Spalte Anhängen als in den gewünschten Datenbanknamen. OK
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
Verwenden Sie die 'Master'-Datenbank und führen Sie diese Abfrage aus. Dadurch werden alle aktiven Verbindungen aus Ihrer Datenbank beendet.
Normalerweise tritt dieser Fehler auf, wenn ich versuche, eine Datenbank wiederherzustellen. Normalerweise gehe ich in Management Studio einfach zum Anfang des Baums und klicke mit der rechten Maustaste auf den Datenbankserver und starte ihn neu (da er sich auf einem Entwicklungscomputer befindet, ist dies in der Produktion möglicherweise nicht ideal ). Dies schließt alle Datenbankverbindungen.
ALTER DATABASE ... SET SINGLE_USER
Befehle in anderen Antworten haben den gleichen Fehler "Exklusive Sperre konnte nicht erhalten werden" zurückgegeben).
Klicken Sie in MS SQL Server Management Studio im Objekt-Explorer mit der rechten Maustaste auf die Datenbank. Wählen Sie im folgenden Kontextmenü "Aufgaben -> Offline nehmen".
Ein weiterer Ansatz "Kill it with Fire" besteht darin, den MSSQLSERVER-Dienst neu zu starten. Ich mache gerne Sachen über die Kommandozeile. Wenn Sie dies genau in CMD einfügen, können Sie Folgendes tun: NET STOP MSSQLSERVER & NET START MSSQLSERVER
Oder öffnen Sie "services.msc" und suchen Sie "SQL Server (MSSQLSERVER)". Klicken Sie mit der rechten Maustaste und wählen Sie "Neustart".
Dies wird "sicher, sicher" ALLE Verbindungen zu ALLEN Datenbanken beenden, die auf dieser Instanz ausgeführt werden.
(Ich mag dies besser als viele Ansätze, die die Konfiguration auf dem Server / der Datenbank ändern und zurücksetzen)
So können Sie solche Dinge in MS SQL Server Management Studio 2008 zuverlässig ausführen (funktioniert möglicherweise auch für andere Versionen):
Die Option, die in diesem Szenario für mich funktioniert, lautet wie folgt:
Versuche dies:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
Klicken Sie mit der rechten Maustaste auf den Datenbanknamen, klicken Sie auf Eigenschaft, um das Eigenschaftenfenster abzurufen. Öffnen Sie die Registerkarte Optionen und ändern Sie die Eigenschaft "Zugriff einschränken" von "Mehrbenutzer" in "Einzelbenutzer". Wenn Sie auf OK klicken, werden Sie aufgefordert, alle offenen Verbindungen zu schließen. Wählen Sie "Ja" und Sie können die Datenbank umbenennen.
Diese funktionierten bei mir nicht (SQL2008 Enterprise), ich konnte auch keine laufenden Prozesse oder Benutzer sehen, die mit der Datenbank verbunden waren. Durch einen Neustart des Servers (Klicken Sie in Management Studio mit der rechten Maustaste auf SQL Server und wählen Sie Neu starten) konnte ich die Datenbank wiederherstellen.
Ich verwende SQL Server 2008 R2, meine Datenbank wurde bereits für einen einzelnen Benutzer festgelegt, und es gab eine Verbindung, die alle Aktionen in der Datenbank einschränkte. Daher reagierte die empfohlene SQLMenace- Lösung mit einem Fehler. Hier ist eine, die in meinem Fall funktioniert hat .
Ich benutze sp_who, um eine Liste aller Prozesse in der Datenbank zu erhalten. Dies ist besser, da Sie möglicherweise überprüfen möchten, welcher Prozess beendet werden soll.
declare @proc table(
SPID bigint,
Status nvarchar(255),
Login nvarchar(255),
HostName nvarchar(255),
BlkBy nvarchar(255),
DBName nvarchar(255),
Command nvarchar(MAX),
CPUTime bigint,
DiskIO bigint,
LastBatch nvarchar(255),
ProgramName nvarchar(255),
SPID2 bigint,
REQUESTID bigint
)
insert into @proc
exec sp_who2
select *, KillCommand = concat('kill ', SPID, ';')
from @proc
Ergebnis
Sie können den Befehl in der KillCommand-Spalte verwenden, um den gewünschten Prozess abzubrechen.
SPID KillCommand
26 kill 26;
27 kill 27;
28 kill 28;
Sie können den Befehl SP_Who verwenden und alle Prozesse beenden, die Ihre Datenbank verwenden, und dann Ihre Datenbank umbenennen.