Je veux renommer une base de données, mais je continue à obtenir l'erreur suivante : " couldn't get exclusive lock' ; on the database, which implies there is some connection(s) still active(s) ".
Comment puis-je tuer toutes les connexions à la base de données afin de pouvoir la renommer ?
Voir [Kill All Active Connections To A Database][1].
La raison pour laquelle l’approche suggérée par [Adam] (https://stackoverflow.com/questions/11620/how-do-you-kill-all-current-connections-to-a-sql-server-2005-database/11627#11627) ne fonctionne pas est que pendant le temps où vous passez en revue les connexions actives, de nouvelles connexions peuvent être établies et vous ne les verrez pas. L'article auquel j'ai fait référence utilise 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] : http://wiki.lessthandot.com/index.php/Kill_All_Active_Connections_To_A_Database
Pour ce faire, remplacez 'DB_NAME' ; par la base de données à laquelle vous souhaitez supprimer 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