298 votes

Comment tuer toutes les connexions actuelles à une base de données SQL Server 2005 ?

Je veux renommer une base de données, mais je continue à obtenir l'erreur "couldn't get exclusive lock" sur la base de données, ce qui implique qu'il y a une ou plusieurs connexions encore actives.

Comment puis-je tuer toutes les connexions à la base de données afin de pouvoir la renommer ?

392voto

SQLMenace Points 68670

La raison pour laquelle l'approche que Adam a suggéré ne fonctionne pas, c'est que pendant que vous bouclez sur les connexions actives, de nouvelles connexions peuvent être établies, et vous les manquerez. Vous pouvez utiliser l'approche suivante qui ne présente pas cet inconvénient :

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

1 votes

Cela ne semble pas fonctionner pour SQL Server 2008... Voici l'erreur que j'ai obtenue : Console : Msg 102, Level 15, State 1, Line 4 Syntaxe incorrecte près de '-'. Msg 319, Level 15, State 1, Line 4 Syntaxe incorrecte près du mot clé 'with'. Si cette instruction est une expression de table commune, une clause xmlnamespaces ou une clause de contexte de suivi des changements, l'instruction précédente doit être terminée par un point-virgule. Msg 102, Level 15, State 1, Line 4 Syntaxe incorrecte près de 'IMMEDIATE'. Commande : ALTER DATABASE ASMR-wdanda SET SINGLE_USER WITH ROLLBACK IMMEDIATE (modifier la base de données ASMR-wdanda)

0 votes

Je viens d'exécuter ceci sur 2008 sans problèmes ALTER DATABASE aspnetdb SET SINGLE_USER WITH ROLLBACK IMMEDIATE select GETDATE() ALTER DATABASE aspnetdb SET MULTI_USER qu'est-ce que vous avez à la place du code commenté ?

0 votes

Cela a fonctionné pour moi avec SQL Server 2008 et l'instance SQL Express.

112voto

Adam Points 8165

Script pour accomplir ceci, remplacez 'DB_NAME' avec la base de données pour tuer toutes les connexions :

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

1 votes

Ça a marché pour moi, j'ai ajouté and spid <> @@SPID a SELECT @sKillConnection afin qu'il n'essaie pas de tuer ma connexion actuelle, ce qui générerait un message d'erreur.

0 votes

Seuls les processus utilisateurs peuvent être tués... toujours bloqué et ne peut pas restaurer le mode multi_utilisateur à cause du blocage.

0 votes

Mateuscb- la seule possibilité que cela ne fonctionne pas sur mssql 10.00 est si vous avez un nom de base de données qui nécessite [] et que vous ne les utilisez pas. ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE fonctionne sous 10, 10.5, 11 et 12.

56voto

btk Points 835

Tuez-le, et tuez-le par le feu :

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

27voto

Joseph Daigle Points 16429

Utilisation de SQL Management Studio Express :

Dans l'arborescence de l'Explorateur d'objets, descendez sous Gestion jusqu'à "Activity Monitor" (si vous ne le trouvez pas, faites un clic droit sur le serveur de base de données et sélectionnez "Activity Monitor"). En ouvrant le Moniteur d'activité, vous pouvez voir toutes les informations sur les processus. Vous devriez être en mesure de trouver les verrous de la base de données qui vous intéresse et de les supprimer, ce qui supprimera également la connexion.

Vous devriez être en mesure de renommer après cela.

0 votes

Je ne vois pas cet élément "Moniteur d'activité" sous Gestion... Encore une fois, c'est peut-être parce que j'utilise SQL 2008 ?

15 votes

J'ai trouvé un "Moniteur d'activité" si vous faites un clic droit sur le SERVEUR, pas sur la base de données. Vous pouvez ensuite sélectionner l'onglet "Processus" et filtrer par base de données.

0 votes

Vous devez apparemment tuer les processus bloqués un par un, mais il s'agit d'une méthode simple qui ne nécessite pas de connexion locale ou l'arrêt du serveur de base de données complet.

25voto

brendan Points 15097

J'ai toujours utilisé :

ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go 
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user 
GO

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X