現在使用中のため、データベースを削除できません


89

データベースを削除したい。私は次のコードを使用しましたが、役に立ちませんでした。

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

現在使用中のため、データベースを削除できないため、エラーが発生します。上記の問題で私を助けてください。

回答:


55

データベースに接続している人。別のデータベースに切り替えてから、それを削除してみてください。

試してみてください

SP_WHO 誰が接続したかを確認する

そしてKILL必要に応じて


14
SQLサーバー管理の場合。スタジオ:データベースを右クリック:[プロパティ]-> [オプション]-> [アクセスの制限]:[シングルユーザー]に設定し、後でドロップを実行します。
AceAlfred 2013

invoke-sqlcmd -ServerInstance localhost'exec sp_who '| where-object {$ _。dbname-eq'myDbName '}は何も返しません。それでも文句を言うまで。これは実際には機能していないようです。
pxtl

112

データベースを削除する前に、まずそのデータベースへの接続を削除します。

私は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なぜこれを早く得られなかったのだろうか、これは非常に便利な答えです。ありがとう
Mehdi LAMRANI 2012年

それは非ユーザープロセスももたらしませんか?
僧侶2013年

「KILLコマンドはユーザートランザクション内では使用できません」というエラーが表示されます。
同盟国

トランザクションが問題を引き起こしている場合は、トランザクションを使用しないでください。
ドンローリング

参考までに、これはあなたが言ったことをしているようですが、私にとっては問題を解決していません。
ドンローリング

42

SQLサーバー管理の場合。スタジオ:

データベースを右クリック:[プロパティ]-> [オプション]-> [アクセスの制限]:[シングルユーザー]に設定し、後でドロップを実行します


Management Studioからデータベースを直接削除する場合は、これが最も直感的なソリューションです。ありがとうございました。
アンドレペナ2016年

私はそれをして、それから使用しましたdrop database myDatabase。それは問題を解決しませんでした。同じエラー(... it is currently is use)が発生しました。
Shahryar Saljoughi

40

手遅れですが、将来のユーザーにとっては役立つかもしれません。

データベースクエリを削除する前に、以下のクエリを使用できます。

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

それが動作します。参照することもできます

SQLスクリプトで「既存の接続を閉じる」を指定するにはどうすればよいですか

お役に立てば幸いです:)


1
初めにこれを追加することを忘れないでくださいuse master go あなたは、現在選択している場合だけでなく、[MyDatabaseという]
タンチョンBUI

1
@ThànhChungBùiあなたが指摘したことは私の問題を解決しました。それは答えに含まれるべきです。ありがとうございました。
Shahryar Saljoughi

29

SQL Server Management Studio 2016で、次の手順を実行します。

  • データベースを右クリック

  • 削除をクリックします

  • 既存の接続を閉じることを確認します

  • 削除操作を実行します


20
select * from sys.sysprocesses where dbid = DB_ID('Test')

(「Test」を削除しようとしているデータベースの名前に置き換えます)これにより、どのプロセスがそれを使用しているかがわかります。

それでも強制的にドロップしたい場合、最終的なアプローチは次のとおりです。

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

お役に立てれば !


あなたは私の日を救いました;)私の場合、上記のどれもうまくいきませんでした、あなたの提案は説明されているようにうまくいきました!
ディミトリ

8

最初にデータベースをオフラインにしてから、データベースをデタッチします。

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

アクションがデータベースを削除するとは思わない。
snp.it

1
データベースをデタッチした後、このクエリで削除する準備が整いました。DROP DATABASE dbname;
HidayatArghandabi19年

6

SQL Management Studioにデータベースをドロップしてメッセージが表示された場合は、選択したデータベースとしてマスターを使用することを忘れないでください。そうしないと、クエリはデータベースへの接続にもなります。

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

私の場合、DBIIへの接続が複数ありました。
AlexMelw 2017年

3

ブルートフォースの回避策は次のとおりです。

  1. SQLServerサービスを停止します。

  2. 対応する.mdfファイルと.ldfファイルを削除します。

  3. SQLServerサービスを開始します。

  4. SSMSに接続し、データベースを削除します。


わたしにはできる。ありがとう。問題は外付けハードドライブだと思います。ファイルをローカルディスクに切り替えました。あなたの解決策をありがとう。
InfZero 2014年

2

以下の2つの答えから派生したスクリプトを使用したことを強調したいと思います。

@HiteshMistryと@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

MS SQL Server 2008を使用して、[接続を閉じる]オプションを指定した[削除]ダイアログで、これが生成されたスクリプトです。これが最適だと思います。

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

これは、SQL Server Management Studioがスクリプトを作成するものであり、私にとってはどうなるかです。私が違ったUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
やり方

1

vb.netを提供したかっただけです(変換したい場合はc言語と同様です)。プログラムの1つをアンインストールする場合にも同様の問題が発生し、DBを削除するのは少し注意が必要でした。はい、ユーザーがサーバーにアクセスして削除する可能性があります。 Expressを使用していますが、それはきれいではありません。数回見て回った後、完璧なコードをまとめました...

    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

これがxChickenxを探している人に役立つことを願っています

更新ここでこのコンバーター を使用するのは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);
        }
    }

質問はそのようにタグ付けされているため、C#応答が必要です。
Mathias Lykkegaard Lorenzen 2014

@MathiasLykkegaardLorenzenすべての言語で.NETコードを翻訳できるフリーウェアアプリがいくつかあります。オンラインアプリもあります。
Ognyan Dimitrov 2015

1
取られたポイント。投票を変更したはずですが、ロックされているため変更できません。
Mathias Lykkegaard Lorenzen 2015

悪いアイデア!正常なときにデータベースを削除しても、データベースファイルは削除されません。これは特別な場合に便利かもしれませんが、盲目的に従うべきパターンではありません。問題:a)ディスクがいっぱいになり、b)同じ物理ファイルを使用してデータベースを再作成しようとすると問題が発生する可能性があります。
Stefan Steinegger 2017

1

まず、接続されているデータベースを確認します

SP_WHO

2番目にデータベースを切断します

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)

最終的にそれをドロップします

drop database your_database

0

現在使用sp_detach_dbされているデータベースを削除することはできませんが、データベースファイルを削除せずにサーバーからデータベースを削除する場合は、ストアドプロシージャを使用できます。


0

DBの名前を変更する(削除する)だけでうまくいきました。データベースにアクセスしているプロセスがすべて停止したため、データベースを削除することができました。


0

使用可能なデータベースセクションに移動し、マスターを選択します。次に、DROP DATABASEthe_DB_nameを試してください。


0

実行中のデータベースを削除するには、このバッチファイルを使用できます

@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

画面

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.