web-dev-qa-db-fra.com

Comment supprimer une base de données en mode Single_User

Comment supprimer une base de données qui affiche DatabaseName (Single User) comme nom?

Lorsque j'essaie de le supprimer, j'obtiens l'erreur suivante:

La modification a échoué pour la base de données 'DatabaseName'. (Microsoft.SqlServer.Smo)

L'instruction ALTER DATABASE a échoué. (Microsoft SQL Server, erreur: 5064)

J'ai essayé d'exécuter le ALTER ci-dessous et j'ai toujours le même problème.

ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT
12
Prasad Kanaparthi

Si vous souhaitez supprimer une base de données, vous devez être la seule connexion à cette base de données. Si d'autres connexions existent, vous ne pouvez pas les supprimer. D'après le message d'erreur (cette erreur signifie que votre base de données est en mode Single_User mais qu'il y a déjà une connexion, vous ne pouvez donc pas vous connecter), mon hypothèse ici est que vous avez essayé de la mettre en mode Single_User et que vous avez ensuite tenté de faire la suppression, mais soit vous saisi une connexion que vous ne connaissiez pas, ou un autre processus a. Le fait que le redémarrage de SSMS ait fonctionné pour vous me dit que c'est probablement vous qui saisissez cette connexion. Voici donc comment résoudre ce problème.

Logiquement, vous devez remettre la base de données en mode multi-utilisateurs afin de pouvoir ensuite la remettre en mode single_user (mais cette fois, vous contrôlerez cette connexion unique autorisée et supprimerez la base de données avant que quelque chose d'autre ne se connecte), puis votre base de données être parti.

Dans le code, voici comment vous devez faire cela (mais fermez d'abord vos fenêtres de requête connectées à cette base de données. Redémarrez SSMS et assurez-vous de ne pas sélectionner cette base de données dans le navigateur d'objets):

-- Then attempt to take your database to multi_user mode, do this from master
USE MASTER 
GO

ALTER DATABASE myDatabaseName 
SET multi_user WITH ROLLBACK IMMEDIATE
GO

-- Now put it into single_user mode and drop it. Use Rollback Immediate to disconnect any sessions and rollback their transactions. Safe since you are about to drop the DB.
ALTER DATABASE myDatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE myDatabaseName
GO
23
Mike Walsh

Si vous essayez d'accéder à la base de données qui est déjà en mode mono-utilisateur, vous devez d'abord fermer toutes les connexions à la base de données, sinon vous obtiendrez un message d'erreur:

Msg 5064, niveau 16, état 1, ligne 1 Les modifications de l'état ou des options de la base de données 'DatabaseName' ne peuvent pas être effectuées pour le moment. La base de données est en mode mono-utilisateur et un utilisateur y est actuellement connecté. Échec de l'instruction Mster 5069, niveau 16, état 1, ligne 1 ALTER DATABASE.

requête suivante tue les processus accédant à la base de données:

-- Create the sql to kill the active database connections  
declare @execSql varchar(1000), @databaseName varchar(100)  
-- Set the database name for which to kill the connections  
set @databaseName = 'DatabaseName'  

set @execSql = ''   
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '  
from    master.dbo.sysprocesses  
where   db_name(dbid) = @databaseName  
     and  
     DBID <> 0  
     and  
     spid <> @@spid  
exec(@execSql)
GO

Ensuite, vous devriez pouvoir ramener la base de données en mode multi-utilisateur comme d'habitude:

ALTER DATABASE 'DatabaseName' SET MULTI_USER
13
Maxim Paukov