Si vous allez 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, puis vous avez 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.
Voici comment procéder dans le code ( mais fermez d'abord les 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 masterUSE MASTER
GO
ALTERDATABASE myDatabaseName
SET multi_user WITHROLLBACK 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.ALTERDATABASE myDatabaseName
SET SINGLE_USER WITHROLLBACK IMMEDIATE
GO
DROPDATABASE myDatabaseName
GO
Cette solution ne fonctionnera pas si la base de données est déjà en mode mono-utilisateur et que vous essayez d'y accéder à partir d'une autre connexion.
Maxim Paukov
4
C'est vrai Maxim - C'est pourquoi j'ai dit que mon hypothèse ici basée sur les informations fournies et la réponse automatique des OP est en fait celle avec la connexion ouverte probablement via l'explorateur d'objets ou une fenêtre de requête ... Si elle était ouverte d'une autre manière par certains autre utilisateur, vous devez alors trouver une connexion qui a volé la connexion unique autorisée, puis tuer la session de cette connexion et suivre les étapes décrites ci-dessus.
Mike Walsh
13
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 Msg 5069, niveau 16, état 1, ligne 1 ALTER DATABASE.
La 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 <>0and
spid <>@@spid
exec(@execSql)
GO
Ensuite, vous devriez pouvoir ramener la base de données en mode multi-utilisateur comme d'habitude:
C'est une solution très, très lourde et équivaut à un jeu frustrant de taper sur un système occupé. Pour expulser tous les utilisateurs, beaucoup plus facile à utiliser, ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEcomme le montre la réponse de Mike.
Aaron Bertrand
1
La solution de @AaronBertrand Mike ne fonctionnera pas si la base de données est déjà en mode mono-utilisateur et que vous essayez d'y accéder à partir d'une autre connexion.
Maxim Paukov
2
Bon, si tel est le cas, il devrait trouver les sessions comme vous l'avez indiqué. Cependant, si la connexion qui a défini la base de données sur single_user est la sienne ...
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:
La requête suivante tue les processus accédant à la base de données:
Ensuite, vous devriez pouvoir ramener la base de données en mode multi-utilisateur comme d'habitude:
la source
ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATE
comme le montre la réponse de Mike.