현재 사용 중이므로 데이터베이스를 삭제할 수 없습니다.


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 서버 관리의 경우. studio : 데이터베이스를 마우스 오른쪽 버튼으로 클릭 : 속성-> 옵션-> 액세스 제한 : "단일 사용자"로 설정하고 나중에 드롭을 수행합니다.
AceAlfred 2013-09-27

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 왜 이것을 더 일찍 얻지 않았는지 궁금합니다. 이것은 매우 편리한 대답입니다. 감사합니다
메디 LAMRANI

비 사용자 프로세스도 가져 오지 않을까요?
monksy

나를 위해 "KILL 명령은 사용자 트랜잭션 내에서 사용할 수 없습니다."라는 오류가 발생합니다.
Ally

거래가 문제를 일으키는 경우 거래를 사용하지 마십시오.
Don Rolling

참고로, 이것은 당신이 말한 것처럼 보이지만 문제를 해결하지 못합니다.
Don Rolling

42

SQL 서버 관리의 경우. 사진관:

데이터베이스를 마우스 오른쪽 단추로 클릭하십시오. 속성-> 옵션-> 액세스 제한 : "단일 사용자"로 설정하고 나중에 드롭을 수행하십시오.


Management Studio에서 바로 데이터베이스를 삭제하려는 경우 가장 직관적 인 솔루션입니다. 감사합니다.
André Pena

나는 그것을 한 다음 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]
탄 정 부이

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;

도움이 되었기를 바랍니다 !


당신은 나의 하루를 구했습니다;) 위의 어떤 것도 제 경우에 효과가 없었습니다. 귀하의 제안은 설명대로 작동했습니다!
Dimitri

8

먼저 데이터베이스를 분리 한 후 오프라인으로 만듭니다.

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

나는 행동이 데이터베이스를 삭제한다고 생각하지 않는다.
snp.it

1
데이터베이스를 분리 한 후 이제이 쿼리로 삭제할 준비가되었습니다. DROP DATABASE dbname;
Hidayat Arghandabi

6

SQL Management Studio에서 데이터베이스를 삭제하고 메시지를 받으면 Master를 선택한 데이터베이스로 사용하는 것을 잊지 마십시오. 그렇지 않으면 쿼리가 데이터베이스에 대한 연결이기도합니다.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

내 경우에는 DB II에 대한 연결이 두 개 이상 끊어지고 싶었습니다.
AlexMelw

3

무차별 대입 해결 방법은 다음과 같습니다.

  1. SQL Server 서비스를 중지하십시오.

  2. 해당 .mdf 및 .ldf 파일을 삭제합니다.

  3. SQL Server 서비스를 시작하십시오.

  4. SSMS에 연결하고 데이터베이스를 삭제합니다.


그것은 나를 위해 작동합니다. 감사. 문제는 외장 하드 드라이브라고 생각합니다. 파일을 로컬 디스크로 전환했습니다. 솔루션에 감사드립니다.
InfZero 2014

2

아래 답변 중 두 가지에서 파생 된 스크립트를 사용했다고 말하고 싶었습니다.

@Hitesh Mistry 및 @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
스미 티 - WERBEN-야거-Manjenson

1

vb.net을 제공하고 싶었습니다 (변환하려는 경우 c 언어와 마찬가지로 ..) 내 프로그램 중 하나를 제거하는 데 비슷한 문제가 발생했습니다. 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를 찾는 사람에게 도움이되기를 바랍니다.

UPDATE 사용 여기 컨버터는 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 15.

1
요점을 알았어. 내 투표를 변경했을 수 있지만 잠겨 있으므로 변경할 수 없습니다.
Mathias Lykkegaard Lorenzen 2015-08-25

나쁜 생각! 정상 상태 일 때 데이터베이스를 삭제해도 데이터베이스 파일이 제거되지 않습니다! 특별한 경우에 이것이 유용 할지라도 맹목적으로 따라야 할 패턴은 아닙니다. 문제 : a) 디스크가 가득 차고 b) 동일한 실제 파일을 사용하여 데이터베이스를 다시 만들려고 할 때 문제가 발생할 수 있습니다.
Stefan Steinegger

1

먼저 연결된 데이터베이스를 확인하십시오.

SP_WHO

둘째, 데이터베이스 연결 해제

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 DATABASE the_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.