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


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.