Risposte:
La ragione per cui l'approccio che Adam ha suggerito non funzionerà è che durante il tempo in cui si esegue il loop sulle connessioni attive è possibile stabilire una nuova, e queste ti mancheranno. È possibile invece utilizzare il seguente approccio che non presenta questo inconveniente:
-- 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
Script per eseguire ciò, sostituire "DB_NAME" con il database per interrompere tutte le connessioni a:
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
a SELECT @sKillConnection
statement in modo che non tentasse di interrompere la mia connessione corrente, che avrebbe generato un messaggio di errore.
Uccidilo e uccidilo con il fuoco:
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
Utilizzando SQL Management Studio Express:
Nella struttura ad albero dell'Explorer eseguire il drill down in Gestione su "Activity Monitor" (se non lo si trova, fare clic con il tasto destro del mouse sul server di database e selezionare "Activity Monitor"). Aprendo Activity Monitor, è possibile visualizzare tutte le informazioni sul processo. Dovresti essere in grado di trovare i blocchi per il database che ti interessa e uccidere quei blocchi, che uccideranno anche la connessione.
Dovresti essere in grado di rinominare dopo quello.
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE [Test]
SET ONLINE
Mettere offline richiede un po 'di tempo e a volte ho dei problemi con quello ...
Il modo più solido secondo me:
Scollega Tasto destro del mouse DB -> Attività -> Scollega ... seleziona "Elimina connessioni" Ok
Ricollega Database Destro -> Allega .. Aggiungi ... -> seleziona il tuo database e cambia la colonna Allega come con il nome del database desiderato. 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
usa il database 'master' ed esegui questa query, ucciderà tutte le connessioni attive dal tuo database.
Di solito mi imbatto in quell'errore quando provo a ripristinare un database Di solito vado semplicemente in cima all'albero in Management Studio e faccio clic con il pulsante destro del mouse e riavvio del server di database (poiché si trova su una macchina di sviluppo, questo potrebbe non essere l'ideale in produzione ). Questo è vicino a tutte le connessioni al database.
ALTER DATABASE ... SET SINGLE_USER
comandi in altre risposte hanno restituito lo stesso errore "Impossibile ottenere il blocco esclusivo").
In MS SQL Server Management Studio su Esplora oggetti, fare clic con il tasto destro del mouse sul database. Nel menu contestuale che segue selezionare 'Attività -> Take Offline'
Un altro approccio "uccidilo con il fuoco" è semplicemente riavviare il servizio MSSQLSERVER. Mi piace fare cose dalla riga di comando. Incollare esattamente questo in CMD lo farà: NET STOP MSSQLSERVER e NET START MSSQLSERVER
Oppure apri "services.msc" e trova "SQL Server (MSSQLSERVER)" e fai clic con il tasto destro del mouse, seleziona "riavvia".
Questo "sicuramente," ucciderà TUTTE le connessioni a TUTTI i database in esecuzione su quell'istanza.
(Mi piace meglio di molti approcci che cambiano e cambiano la configurazione sul server / database)
Ecco come fare in modo affidabile questo genere di cose in MS SQL Server Management Studio 2008 (potrebbe funzionare anche per altre versioni):
L'opzione che funziona per me in questo scenario è la seguente:
Prova questo:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
Fare clic con il tasto destro sul nome del database, fare clic su Proprietà per ottenere la finestra delle proprietà, Aprire la scheda Opzioni e modificare la proprietà "Limita accesso" da Multiutente a Singolo utente. Quando premi il pulsante OK, ti verrà chiesto di chiudere tutte le connessioni aperte, selezionare "Sì" e sei pronto per rinominare il database ....
Questi non hanno funzionato per me (SQL2008 Enterprise), inoltre non sono riuscito a vedere alcun processo in esecuzione o utenti collegati al DB. Il riavvio del server (fare clic con il tasto destro del mouse su SQL Server in Management Studio e selezionare Riavvia) mi ha permesso di ripristinare il DB.
Sto usando SQL Server 2008 R2, il mio DB era già impostato per singolo utente e c'era una connessione che limitava qualsiasi azione sul database. Pertanto la soluzione consigliata di SQLMenace ha risposto con errore. Eccone uno che ha funzionato nel mio caso .
Uso sp_who per ottenere l'elenco di tutti i processi nel database. Questo è meglio perché potresti voler rivedere quale processo uccidere.
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
Risultato
È possibile utilizzare il comando nella colonna KillCommand per terminare il processo desiderato.
SPID KillCommand
26 kill 26;
27 kill 27;
28 kill 28;
È possibile utilizzare il comando SP_Who e terminare tutti i processi che utilizzano il database, quindi rinominare il database.