Impossible de supprimer la base de données car elle est actuellement utilisée

89

Je veux supprimer une base de données. J'ai utilisé le code suivant, mais en vain.

public void DropDataBase(string DBName,SqlConnection scon)
{
    try
    {
        SqlConnection.ClearAllPools();
        SqlCommand cmd = new SqlCommand("ALTER DATABASE " + DBName + "     SET SINGLE_USER     WITH ROLLBACK IMMEDIATE", scon);
        cmd.CommandType = CommandType.Text;
        scon.Open();
        cmd.ExecuteNonQuery();
        scon.Close();

        SqlCommand cmddrpdb = new SqlCommand("drop database " + DBName + "", scon);
        cmddrpdb.CommandType = CommandType.Text;
        scon.Open();
        cmddrpdb.ExecuteNonQuery();
        scon.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show("DropDataBase : " +ex.Message);
    }
}

J'obtiens une erreur car je ne peux pas supprimer la base de données car elle est actuellement utilisée . Veuillez m'aider dans le problème mentionné ci-dessus.

sachin kulkarni
la source

Réponses:

55

Quelqu'un s'est connecté à la base de données. Essayez de basculer vers une autre base de données, puis de la supprimer:

Essayer

SP_WHO pour voir qui s'est connecté

et KILLsi besoin

Grégory Nozik
la source
14
Pour le serveur SQL mgmt. studio: Faites un clic droit sur la base de données: Propriétés -> Options -> Restreindre l'accès: Réglez sur "Utilisateur unique" et effectuez la suppression par la suite.
AceAlfred le
invoke-sqlcmd -ServerInstance hôte local 'exec sp_who' | where-object {$ _. dbname -eq 'myDbName'} ne renvoie rien. Pourtant, il se plaint. Cela ne semble pas vraiment fonctionner.
Pxtl
112

avant de supprimer une base de données, vous supprimez d'abord la connexion à cette base de données.

J'ai trouvé une solution sur http://www.kodyaz.com/articles/kill-all-processes-of-a-database.aspx

DECLARE @DatabaseName nvarchar(50)
SET @DatabaseName = N'YOUR_DABASE_NAME'

DECLARE @SQL varchar(max)

SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';'
FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId

--SELECT @SQL 
EXEC(@SQL)
garçon non réglé
la source
1
+1 Je me demande pourquoi vous n'avez pas reçu cela plus tôt, c'est une réponse très pratique. Merci
Mehdi LAMRANI
Cela n'entraînera-t-il pas également des processus non utilisateurs?
monksy
Pour moi, j'obtiens l'erreur "La commande KILL ne peut pas être utilisée dans les transactions utilisateur."
Ally
Si la transaction pose un problème, n'utilisez pas la transaction.
Don Rolling
Pour votre information, cela semble faire ce que vous avez dit, mais ne résout pas le problème pour moi.
Don Rolling
43

Pour le serveur SQL mgmt. studio:

Faites un clic droit sur la base de données: Propriétés -> Options -> Restreindre l'accès: Réglez sur "Utilisateur unique" et effectuez la suppression par la suite

AceAlfred
la source
Si vous souhaitez supprimer une base de données directement depuis Management Studio, c'est la solution la plus intuitive. Merci.
André Pena le
Je l'ai fait, puis utilisé drop database myDatabase. Cela n'a pas résolu le problème. la même erreur ( ... it is currently is use) s'est produite.
Shahryar Saljoughi
40

Il est trop tard, mais cela peut être utile pour les futurs utilisateurs.

Vous pouvez utiliser la requête ci-dessous avant de supprimer la requête de base de données:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

Ça va marcher. Vous pouvez également vous référer à

Comment spécifier "fermer les connexions existantes" dans le script SQL

J'espère que cela vous aidera :)

Hitesh
la source
1
n'oubliez pas de l'ajouter au début use master go si vous sélectionnez actuellement [MyDatabase]
Thành Chung Bùi
1
@ ThànhChungBùi ce que vous avez indiqué a résolu mon problème. Il devrait être inclus dans les réponses. Merci.
Shahryar Saljoughi
29

Dans SQL Server Management Studio 2016, procédez comme suit:

  • Faites un clic droit sur la base de données

  • Cliquez sur supprimer

  • Vérifier fermer les connexions existantes

  • Effectuer l'opération de suppression

Shashi Dhar
la source
20
select * from sys.sysprocesses where dbid = DB_ID('Test')

(Remplacez «Test» par le nom de la base de données que vous essayez de supprimer) Cela vous indiquera quels processus l'utilisent.

Si vous voulez toujours forcer la chute, l'approche ultime est:

USE master;
GO
ALTER DATABASE Test 
SET SINGLE_USER 
WITH ROLLBACK IMMEDIATE;
GO
DROP DATABASE Test;

J'espère que cela t'aides !

Raza
la source
Vous monsieur m'a sauvé la journée;) Rien de ce qui précède n'a fonctionné dans mon cas, vos suggestions ont fonctionné comme décrit!
Dimitri
8

Commencez par mettre votre base de données hors ligne, puis détachez-la, par exemple

Use Master
GO
ALTER DATABASE dbname SET OFFLINE
GO
EXEC sp_detach_db 'dbname', 'true'
Abhishek Upadhyay
la source
Je ne pense pas que l'action supprime la base de données.
snp.it
1
après avoir détaché la base de données, elle est maintenant prête à être supprimée avec cette requête. DROP DATABASE dbname;
Hidayat Arghandabi
6

Si vous déposez la base de données dans SQL Management Studio et que vous obtenez le message, n'oubliez pas que vous utilisez Master comme base de données sélectionnée, sinon votre requête est également une connexion à la base de données.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO
LockTar
la source
Dans mon cas, j'avais plus d'une connexion à la DB II que je voulais abandonner.
AlexMelw
3

Une solution de contournement de force brute pourrait être:

  1. Arrêtez le service SQL Server.

  2. Supprimez les fichiers .mdf et .ldf correspondants.

  3. Démarrez le service SQL Server.

  4. Connectez-vous avec SSMS et supprimez la base de données.

HerbalMart
la source
Ça marche pour moi. Merci. Je pense que le problème est un disque dur externe. J'ai basculé le fichier sur un disque local. Merci pour votre solution.
InfZero
2

Je voulais souligner que j'ai utilisé un script dérivé de deux des réponses ci-dessous.

Accessoires pour @Hitesh Mistry et @unruledboy

DECLARE @DatabaseName nvarchar(50)
SET @DatabaseName = N'[[[DatabaseName]]]'

DECLARE @SQL varchar(max)

SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';'
FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId

EXEC(@SQL)

alter database [[[DatabaseName]]] set single_user with rollback immediate

DROP DATABASE [[[DatabaseName]]]
Don Rolling
la source
1

En utilisant MS SQL Server 2008, dans la boîte de dialogue SUPPRIMER avec les options de connexion Fermer, c'est le script généré, je suppose que c'est le meilleur:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'YOUR_DATABASE_NAME'
GO
USE [master]
GO
ALTER DATABASE [YOUR_DATABASE_NAME] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
/****** Object:  Database [YOUR_DATABASE_NAME]    Script Date: 01/08/2014 21:36:29 ******/
DROP DATABASE [YOUR_DATABASE_NAME]
GO
Luke Vo
la source
C'est ce que SQL Server Management Studio écrit et ce qui fonctionne pour moi. La seule chose que j'ai faite différemment a été d'envelopper tout cela dans unUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson
1

Je voulais juste donner un vb.net (comme avec le langage c si je veux convertir ..) J'avais un problème similaire pour la désinstallation de l'un de mes programmes, abandonner la base de données était un peu délicat, oui, les utilisateurs pouvaient aller dans le serveur. en utilisant Express, mais ce n'est pas propre, après quelques regards, nous avons obtenu un petit morceau de code parfait ...

    Sub DropMyDatabase()
    Dim Your_DB_To_Drop_Name As String = "YourDB"
    Dim Your_Connection_String_Here As String = "SERVER=MyServer;Integrated Security=True"
    Dim Conn As SqlConnection = New SqlConnection(Your_Connection_String_Here)

    Dim AlterStr As String = "ALTER DATABASE " & Your_DB_To_Drop_Name & " SET OFFLINE WITH ROLLBACK IMMEDIATE"
    Dim AlterCmd = New SqlCommand(AlterStr, Conn)

    Dim DropStr As String = "DROP DATABASE " & Your_DB_To_Drop_Name
    Dim DropCmd = New SqlCommand(DropStr, Conn)

    Try
        Conn.Open()
        AlterCmd.ExecuteNonQuery()
        DropCmd.ExecuteNonQuery()
        Conn.Close()

    Catch ex As Exception
        If (Conn.State = ConnectionState.Open) Then
            Conn.Close()
        End If
        MsgBox("Failed... Sorry!" & vbCrLf & vbCrLf & ex.Message)
    End Try
End Sub

J'espère que cela aide tous ceux qui recherchent xChickenx

MISE À JOUR En utilisant ce convertisseur, voici la version C #:

public void DropMyDatabase()
    {
        var Your_DB_To_Drop_Name = "YourDB";
        var Your_Connection_String_Here = "SERVER=MyServer;Integrated Security=True";
        var Conn = new SqlConnection(Your_Connection_String_Here);

        var AlterStr = "ALTER DATABASE " + Your_DB_To_Drop_Name + " SET OFFLINE WITH ROLLBACK IMMEDIATE";
        var AlterCmd = new SqlCommand(AlterStr, Conn);

        var DropStr = "DROP DATABASE " + Your_DB_To_Drop_Name;
        var DropCmd = new SqlCommand(DropStr, Conn);

        try
        {
            Conn.Open();
            AlterCmd.ExecuteNonQuery();
            DropCmd.ExecuteNonQuery();
            Conn.Close();

        }
        catch(Exception ex)
        {
            if((Conn.State == ConnectionState.Open))
            {
                Conn.Close();
            }
            Trace.WriteLine("Failed... Sorry!" + Environment.NewLine + ex.Message);
        }
    }
poulet
la source
La question nécessite une réponse C #, car elle est étiquetée de cette façon.
Mathias Lykkegaard Lorenzen
@MathiasLykkegaardLorenzen, il existe plusieurs applications gratuites qui peuvent traduire du code .NET dans toutes les langues. Il y a même des applications en ligne.
Ognyan Dimitrov
1
Point pris. J'aurais changé mon vote, mais je ne peux pas, car il est verrouillé.
Mathias Lykkegaard Lorenzen
MAUVAISE IDÉE! Supprimer une base de données lorsqu'elle est hors ligne ne supprimera pas les fichiers de la base de données! Même si cela peut être pratique dans certains cas particuliers, ce n'est pas un modèle que vous devez suivre aveuglément. Problèmes: a) votre disque se remplit et b) vous pourriez rencontrer des problèmes en essayant de recréer la base de données en utilisant les mêmes fichiers physiques.
Stefan Steinegger
1

Vérifiez d'abord les bases de données connectées

SP_WHO

Débranchez votre base de données

DECLARE @DatabaseName nvarchar(50)
SET @DatabaseName = N'your_database_name'

DECLARE @SQL varchar(max)

SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';'
FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId

--SELECT @SQL 
EXEC(@SQL)

DÉPOSEZ-LE ENFIN

drop database your_database
Sajid khan
la source
0

Vous ne pouvez pas supprimer une base de données actuellement utilisée, mais vous pouvez utiliser la sp_detach_dbprocédure stockée si vous souhaitez supprimer une base de données du serveur sans supprimer les fichiers de base de données.

adatapost
la source
0

le simple fait de renommer la base de données (à supprimer) a fait l'affaire pour moi. il s'est détaché de tout processus accédant à la base de données, et j'ai donc pu supprimer la base de données.

AceMark
la source
0

Accédez à la section des bases de données disponibles et sélectionnez maître. Essayez ensuite DROP DATABASE the_DB_name.


la source
0

Pour supprimer une base de données même si elle est en cours d'exécution, vous pouvez utiliser ce fichier de commandes

@echo off

set /p dbName= "Enter your database name to drop: " 

echo Setting to single-user mode
sqlcmd -Q "ALTER DATABASE [%dbName%] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE"

echo Dropping...
sqlcmd -Q "drop database %dbName%"

echo Completed.

pause

Écran

Alper Ebicoglu
la source