Cum omori toate conexiunile curente la o baza de date SQL Server 2005?

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?

Soluția

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

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

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
Comentarii (1)

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.

Comentarii (3)

Am'am folosit mereu:

ALTER DATABASE NUME_BD SET SINGLE_USER CU REVENIRE IMEDIATĂ 
DU-te 
SP_RENAMEDB 'NUME_BD','DB_NAME_NEW'
Du-te 
ALTER DATABASE DB_NAME_NEW SET MULTI_USER -- set înapoi la multi utilizator 
DU-te 
Comentarii (1)
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE
Comentarii (0)

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

Comentarii (2)
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.

Comentarii (1)

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.

Comentarii (1)

În MS SQL Server Management Studio pe obiect explorer, click dreapta pe baza de date. În meniul contextual care urmează selecta 'Sarcini -> Ia Deconectat'

Comentarii (1)

Aici's cum sa fiabil acest fel de lucru în MS SQL Server Management Studio 2008 (pot lucra pentru alte versiuni prea):

  1. În Object Explorer Copac, faceți clic dreapta pe root server de baze de date (cu sageata verde), apoi faceți clic pe monitor de activitate.
  2. Deschideți fila procese în activity monitor, selectați 'baze de date' drop-down, și filtru de baza de date pe care doriți.
  3. Faceți clic dreapta pe DB din Object Explorer și începe o 'Sarcini -> Ia Deconectat' sarcina. Las asta care rulează în fundal în timp ce tu...
  4. Închide în condiții de siguranță tot ce poți.
  5. Ucide toate celelalte procese din procesul tab.
  6. Aduce DB înapoi on-line.
  7. Redenumiți DB.
  8. Aduce nou serviciu on-line și punctul în care la noul DB.
Comentarii (0)

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)

Comentarii (3)

Opțiunea lucru pentru mine în acest scenariu este după cum urmează:

  1. Începe "Detașa" operarea în baza de date în cauză. Acesta va deschide o fereastră (în SQL 2005) afișarea conexiunilor active care împiedică acțiunile privind PB.
  2. Ucide conexiuni active, anula desprinde-operațiune.
  3. Baza de date ar trebui să fie acum disponibile pentru restabilirea.
Comentarii (2)

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....

Comentarii (0)

Încercați acest lucru:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
Comentarii (0)

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.

Comentarii (0)

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.

Comentarii (0)

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;
Comentarii (0)

Puteți Utiliza SP_Who comandă și ucide toate procesele care utilizează baza de date și apoi redenumiți baza dumneavoastră de date.

Comentarii (0)