web-dev-qa-db-fra.com

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

Je veux déposer 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);
    }
}

Je reçois une erreur en tant que ne peut pas supprimer la base de données car elle est actuellement utilisée. S'il vous plaît aidez-moi dans le problème mentionné ci-dessus.

72
sachin kulkarni

Quelqu'un connecté à la base de données. Essayez de passer à une autre base de données, puis de la supprimer

Essayer

SP_WHO pour voir qui s'est connecté

et KILL si nécessaire

41
Gregory Nozik

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)
94
unruledboy

Pour le serveur SQL mgmt. studio:

Cliquez avec le bouton droit sur la base de données: Propriétés -> Options -> Restreindre: définissez sur "Utilisateur unique", puis effectuez la suppression.

34
AceAlfred

C'est trop tard, mais cela pourrait ê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 puis-je spécifier "fermer les connexions existantes" dans le script SQL

J'espère que ça va t'aider :)

30
Hitesh

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

  • Clic droit sur la base de données

  • Cliquez sur supprimer

  • Vérifiez fermer les connexions existantes

  • Effectuer une opération de suppression

21
Shashi Dhar
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 drop alors, 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 !

12
Raza

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

USE Master;
GO
DROP DATABASE AdventureWorks;
GO
4
Ralph Jansen

Commencez par déconnecter votre base de données après l'avoir détachée, par exemple.

Use Master
GO
ALTER DATABASE dbname SET OFFLINE
GO
EXEC sp_detach_db 'dbname', 'true'
3

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

Accessoires de @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]]]
2
Don Rolling

Une solution 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.

2
HerbalMart

Je voulais juste donner à vb.net (comme avec le langage C si je veux convertir ..) J'avais un problème similaire pour l'uninstal de l'un de mes programmes, la suppression de la base de données était un peu délicate. en utilisant Express, mais ce n’est pas propre, après quelques recherches autour, nous avons obtenu un petit bout de code parfait ensemble ...

    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 ceux qui cherchent xChickenx

[~ # ~] mettre à jour [~ # ~] Utiliser this 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);
        }
    }
1
Chicken

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

0
Nodeum

Vous ne pouvez pas supprimer une base de données en cours d'utilisation, mais vous pouvez utiliser sp_detach_db procédure stockée si vous souhaitez supprimer une base de données du serveur sans supprimer les fichiers de la base de données.

0
adatapost

En utilisant MS SQL Server 2008, dans la boîte de dialogue SUPPRIMER avec les options de connexion Fermer, voici 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
0
Luke Vo

le simple fait de renommer la base de données (à supprimer) a été efficace pour moi. il a échappé à tout processus accédant à la base de données et j'ai donc pu supprimer la base de données.

0
AceMark