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.

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


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)

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


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 :)


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


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 !


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'

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

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.


Ç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]]]

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

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);
        }
    }

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

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.


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.


0

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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.