Vreau să redenumiți o bază de date, dar tot primesc eroarea asta 'n't obține exclusiv de blocare' pe bază de date, care implică există o legătură(s) încă activ.
Cum pot ucide toate conexiunile la baza de date, astfel încât să pot redenumi?
A Se Vedea Ucide Toate Conexiunile Active La O Bază De Date.
Motivul pentru care abordarea pe care Adam suggested a câștigat't de lucru este că în momentul în care ești looping peste conexiuni active nou poate fi stabilit, și te'll-e dor de acele. În articol am legat utilizează următoarele abordări care nu au acest dezavantaj:
-- 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 pentru a realiza acest lucru, înlocuiți 'NUME_BD' cu baza de date pentru a ucide toate conexiunile la:
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
Ucide și ucide cu foc:
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
Folosind SQL Management Studio Express:
În Object Explorer copac detalia sub Management pentru a "Monitor de Activitate" (dacă nu puteți găsi acolo, apoi click dreapta pe serverul de baze de date și selectați "Monitor de Activitate"). Deschide Activity Monitor, puteți vizualiza toate procesa informatii. Tu ar trebui să fie capabil de a găsi încuietori pentru baza de date te're interesat în și ucide aceste încuietori, care va ucide, de asemenea, conexiunea.
Tu ar trebui să fie capabil de a redenumi după aceea.
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE [Test]
SET ONLINE
Ia deconectat nevoie de un timp și, uneori, am experimenta unele probleme cu asta..
Cel mai solid mod, în opinia mea:
Detașa Click dreapta DB -> Sarcini -> Detașa... verificați "Drop Conexiuni" Ok
Reatașați Click dreapta Baze de date -> Atașați.. Adauga... -> selectați baza de date, și de a schimba Atașa la Fel de coloana a dorit, numele bazei de date. 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
folosi 'master' date și a alerga această interogare, acesta va ucide toate conexiunile active din baza de date.
Eu de obicei rula în eroare atunci când sunt încercarea de a restabili o bază de date de obicei doar du-te la partea de sus a copac în Management Studio și dați clic dreapta și reporniți serverul de baze de date (pentru ca's pe o mașină de dezvoltare, acest lucru nu ar putea fi idealul în producție). Acest lucru este de a închide toate conexiunile de date.
Aici's cum sa fiabil acest fel de lucru în MS SQL Server Management Studio 2008 (pot lucra pentru alte versiuni prea):
Un alt "ucide cu foc" abordare este să reporniți serviciul MSSQLSERVER. Îmi place să fac lucrurile de comandă. Lipirea exact în CMD va face: NET STOP MSSQLSERVER & NET START MSSQLSERVER
Sau să deschideți "servicii.msc" și de a găsi "SQL Server (MSSQLSERVER)" și faceți clic dreapta, selectați "restart".
Acest lucru va "sigur, sigur" ucide TOATE conexiunile la TOATE bazele de date care rulează pe acel exemplu.
(Îmi place acest lucru mai bine decât multe abordări care se schimba și de a schimba înapoi de configurare pe server/baza de date)
Opțiunea lucru pentru mine în acest scenariu este după cum urmează:
Click dreapta pe numele bazei de date, faceți clic pe Proprietăți pentru a obține fereastra de proprietăți, Deschideți fila Opțiuni și de a schimba "Restricționa Accesul" proprietate de Utilizator Multiple pentru un Singur Utilizator. Când te-a lovit pe butonul OK, se va solicita pentru a închide toate conexiune deschisă, selectați "Da" și vă sunt setate pentru a redenumi baza de date....
Aceste n't de lucru pentru mine (SQL2008 Enterprise), de asemenea, am putea't vedea toate procesele care rulează, sau utilizatori conectat la DB. Repornirea server (click Dreapta pe Sql Server Management Studio și alege Restart) mi-a permis să reinstituie nivelul din PB.
Am'm folosind SQL Server 2008 R2, DB mea a fost deja stabilit pentru un singur utilizator și există o legătură interzisă orice acțiune în baza de date. Astfel recomandat SQLMenace's soluție a răspuns cu eroarea. Aici este una care a funcționat în cazul meu.
Eu folosesc sp_who pentru a obține lista tuturor proces în baza de date. Acest lucru este mai bună pentru că poate doriți să revizuiască care procesul de a ucide.
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
Rezultat Puteți utiliza comanda în KillCommand coloana a ucide procesul vrei.
SPID KillCommand
26 kill 26;
27 kill 27;
28 kill 28;