Assurez-vous de ne pas avoir de dépendances telles que des instantanés de base de données sur la base de données que vous souhaitez supprimer. Cependant, le message d'erreur ressemblerait autrement. Êtes-vous sûr qu'il n'y a pas de processus caché qui se connecte à votre base de données? Une bonne approche consisterait à exécuter un script qui tue toutes les sessions et immédiatement après, renommez la base de données sous un autre nom, puis supprimez la base de données.
créer un curseur à partir de cette sélection:
select d.name , convert (smallint, req_spid) As spid
from master.dbo.syslockinfo l,
master.dbo.spt_values v,
master.dbo.spt_values x,
master.dbo.spt_values u,
master.dbo.sysdatabases d
where l.rsc_type = v.number
and v.type = 'LR'
and l.req_status = x.number
and x.type = 'LS'
and l.req_mode + 1 = u.number
and u.type = 'L'
and l.rsc_dbid = d.dbid
and rsc_dbid = (select top 1 dbid from
master..sysdatabases
where name like 'my_db')
question à l'intérieur du curseur:
SET @kill_process = 'KILL ' + @spid
EXEC master.dbo.sp_executesql @kill_process
PRINT 'killed spid : '+ @spid
une fois le curseur fermé et désalloué:
sp_dboption 'my_db', 'single user', 'TRUE'
go
sp_renamedb 'my_db', 'my_db_old'
go
DROP DATABASE MY_DB_OLD
Une session connectée à une autre base de données peut avoir une transaction ouverte qui affecte également votre base de données - sp_who2 n'affichera qu'une base de données. Cela pourrait également être quelque chose d'aussi simple que l'explorateur d'objets ou les détails de l'explorateur d'objets ouverts dans SSMS, qui ne montreraient qu'une seule base de données dans sp_who2.
N'essayez pas de trouver la session responsable. tuez-les tous avec une seule déclaration (et assurez-vous que ce n'est pas votre copie de SSMS qui est connectée, par exemple une autre fenêtre de requête, un explorateur d'objets, etc.):
Maintenant, vous pourrez le laisser tomber, et le faire en utilisant DDL, pas l'interface utilisateur:
la source
USE master
alorsDROP DATABASE dbname
. Apparemment, tout ce qu'il faut, c'est simplement "utiliser" autre chose, pour libérer la base de données.Quelle est votre base de données actuelle lorsque vous exécutez la
DROP
commande? Essaye ça:Assurez-vous également que vous êtes connecté en tant que
sa
et nondbo
sur la base de données que vous souhaitez supprimer.la source
Pourquoi ne pas simplement voir ce que SSMS fait lorsque vous utilisez l'interface utilisateur, mais que vous lui dites d'émettre un script pour l'action? Voici ce que fait SSMS lorsque vous cliquez avec le bouton droit de la souris sur la base de données et que vous choisissez Supprimer, puis cochez la case pour fermer les connexions existantes:
la source
J'ai fait face à cette situation plusieurs fois et voici ce que je fais:
Lorsque des méthodes évidentes ne fonctionnent pas ..... (comme dans votre cas):
Découvrez l'ID de base de données à partir de sysdatabases.
Puis exécutez -
sp_lock
cela affichera tous les verrous sur l'instance avec spid et dbid.Tuez les spids avec le dbid que vous essayez de déconnecter ou de supprimer.
Bien que le processus soit un peu manuel, il peut être automatisé comme suit:
la source
Trouvé réponse très simple sur StackOverflow qui a fonctionné la première fois pour moi:
https://stackoverflow.com/a/7469167/261405
Voici le SQL de cette réponse:
la source