Không thể bỏ cơ sở dữ liệu vì nó hiện đang được sử dụng


89

Tôi muốn thả một cơ sở dữ liệu. Tôi đã sử dụng mã sau đây, nhưng vô ích.

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

Tôi nhận được Lỗi không thể thả cơ sở dữ liệu vì nó hiện đang được sử dụng . Xin hãy giúp tôi trong vấn đề được đề cập ở trên.

Câu trả lời:


55

Ai đó đã kết nối với cơ sở dữ liệu. Cố gắng chuyển sang cơ sở dữ liệu khác và sau đó, bỏ nó:

Thử

SP_WHO để xem ai đã kết nối

KILLnếu cần


14
Đối với máy chủ SQL mgmt. studio: Nhấp chuột phải vào cơ sở dữ liệu: Thuộc tính -> Tùy chọn -> Hạn chế truy cập: Đặt thành "Người dùng đơn" và thực hiện thả sau đó.
AceAlfred

invoke-sqlcmd -ServerInstance localhost 'thi hành sp_who' | where-object {$ _. dbname -eq 'myDbName'} không trả về kết quả nào. Tuy nhiên, nó cho đến khi phàn nàn. Điều này dường như không thực sự hiệu quả.
Pxtl

112

trước khi bỏ cơ sở dữ liệu, bạn bỏ kết nối đến cơ sở dữ liệu đó trước.

Tôi đã tìm thấy giải pháp tại 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 Tôi tự hỏi tại sao bạn không nhận được điều này sớm hơn, đây là một câu trả lời rất hữu ích. Cảm ơn
Mehdi LAMRANI

Điều đó sẽ không mang lại các quy trình không phải của người dùng?
Mony

Đối với tôi, tôi gặp lỗi "Không thể sử dụng lệnh KILL bên trong các giao dịch của người dùng."
Ally

Nếu giao dịch đang gây ra sự cố, không sử dụng giao dịch.
Don Rolling

FYI, điều này có vẻ đúng với những gì bạn đã nói, nhưng không giải quyết được vấn đề cho tôi.
Don Rolling

42

Đối với máy chủ SQL mgmt. studio:

Nhấp chuột phải vào cơ sở dữ liệu: Thuộc tính -> Tùy chọn -> Hạn chế truy cập: Đặt thành "Người dùng đơn" và thực hiện thả sau đó


Nếu bạn muốn xóa cơ sở dữ liệu ngay từ Management Studio, đây là giải pháp trực quan nhất. Cảm ơn bạn.
André Pena

Tôi đã làm nó, và sau đó sử dụng drop database myDatabase. Nó không giải quyết được vấn đề. cùng một lỗi ( ... it is currently is use) đã xảy ra .
Shahryar Saljoughi

40

Đã quá muộn, nhưng nó có thể hữu ích cho những người dùng trong tương lai.

Bạn có thể sử dụng truy vấn dưới đây trước khi bỏ truy vấn cơ sở dữ liệu:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

Nó sẽ hoạt động. Bạn cũng có thể tham khảo thêm

Làm cách nào để chỉ định "đóng các kết nối hiện có" trong tập lệnh sql

Tôi hy vọng nó sẽ giúp bạn :)


1
Đừng quên thêm điều này ngay từ đầu use master go nếu bạn hiện đang chọn [MyDatabase]
Thành Chung Bùi

1
@ ThànhChungBùi gì bạn chỉ vào đã giải quyết được vấn đề của tôi. Nó nên được bao gồm trong các câu trả lời. Cảm ơn bạn.
Shahryar Saljoughi

29

Trong SQL Server Management Studio 2016, hãy thực hiện như sau:

  • Nhấp chuột phải vào cơ sở dữ liệu

  • Bấm xóa

  • Kiểm tra đóng các kết nối hiện có

  • Thực hiện thao tác xóa


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

(Thay thế 'Kiểm tra' bằng tên của cơ sở dữ liệu bạn đang cố gắng loại bỏ) Điều này sẽ cho bạn biết quy trình nào đang sử dụng nó.

Nếu bạn vẫn muốn buộc phải thả thì cách tiếp cận cuối cùng là:

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

Hi vọng điêu nay co ich !


Bạn đã cứu ngày của tôi;) Không có gì ở trên hoạt động trong trường hợp của tôi, đề xuất của bạn hoạt động như mô tả!
Dimitri

8

Đầu tiên hãy đặt cơ sở dữ liệu của bạn ngoại tuyến sau khi tách nó ra, ví dụ:

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

Tôi không nghĩ rằng hành động xóa cơ sở dữ liệu.
snp.it

1
sau khi tách cơ sở dữ liệu bây giờ nó đã sẵn sàng để bị xóa với truy vấn này. DROP DATABASE dbname;
Hidayat Arghandabi

6

Nếu bạn thả cơ sở dữ liệu trong SQL Management Studio và bạn nhận được thông báo, đừng quên rằng bạn sử dụng Master làm cơ sở dữ liệu đã chọn, nếu không truy vấn của bạn cũng là một kết nối với cơ sở dữ liệu.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

Tôi trường hợp của tôi, tôi có nhiều hơn 1 kết nối với DB II muốn bị loại bỏ.
AlexMelw

3

Một cách giải quyết vũ phu có thể là:

  1. Dừng dịch vụ máy chủ SQL.

  2. Xóa các tệp .mdf và .ldf tương ứng.

  3. Khởi động dịch vụ máy chủ SQL.

  4. Kết nối với SSMS và xóa cơ sở dữ liệu.


Nó làm việc cho tôi. Cảm ơn. Tôi nghĩ rằng vấn đề là một ổ cứng bên ngoài. Tôi đã chuyển tệp sang đĩa cục bộ. Cảm ơn giải pháp của bạn.
InfZero

2

Tôi muốn thông báo rằng tôi đã sử dụng một tập lệnh bắt nguồn từ hai trong số các câu trả lời bên dưới.

Đạo cụ cho @Hitesh Mistry và @unrisedboy

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

Sử dụng MS SQL Server 2008, trong hộp thoại XÓA với tùy chọn Đóng kết nối, đây là tập lệnh được tạo, tôi đoán nó là tốt nhất:

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

Đây là những gì SQL Server Management Studio tập lệnh ra và những gì sẽ xảy ra với tôi. Điều duy nhất tôi làm khác đi là bọc tất cả những thứ đó bên trong mộtUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson

1

Tôi chỉ muốn cung cấp một vb.net (như với ngôn ngữ c nếu muốn chuyển đổi ..) Tôi đã gặp vấn đề tương tự đối với việc gỡ cài đặt một trong các chương trình của mình, việc thả DB hơi khó, có thể khiến người dùng truy cập vào máy chủ. bằng cách sử dụng Express, nhưng điều đó không rõ ràng, sau vài lần xem xét xung quanh đã có một đoạn mã nhỏ hoàn hảo với nhau ...

    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

Hy vọng điều này sẽ giúp bất kỳ ai đang tìm kiếm xChickenx

CẬP NHẬT Sử dụng công cụ chuyển đổi này ở đây là phiên bản 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âu hỏi cần một câu trả lời C #, vì nó được gắn thẻ theo cách đó.
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen có một số ứng dụng phần mềm miễn phí có thể dịch mã .NET trên tất cả các ngôn ngữ. Có cả ứng dụng trực tuyến.
Ognyan Dimitrov

1
Đã thực hiện. Tôi lẽ ra đã thay đổi phiếu bầu của mình, nhưng tôi không thể, vì nó đã bị khóa.
Mathias Lykkegaard Lorenzen

Ý TƯỞNG XẤU! Bỏ cơ sở dữ liệu khi nó không hợp lệ sẽ không loại bỏ các tệp cơ sở dữ liệu! Ngay cả khi điều này có thể hữu ích trong một số trường hợp đặc biệt, nó không phải là một khuôn mẫu bạn nên làm theo một cách mù quáng. Các vấn đề: a) đĩa của bạn bị đầy và b) bạn có thể gặp sự cố khi cố gắng tạo lại cơ sở dữ liệu bằng các tệp vật lý giống nhau.
Stefan Steinegger

1

Trước tiên hãy kiểm tra các cơ sở dữ liệu được kết nối

SP_WHO

Thứ hai Ngắt kết nối cơ sở dữ liệu của bạn

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)

CUỐI CÙNG XÓA NÓ

drop database your_database

0

Bạn không thể loại bỏ cơ sở dữ liệu hiện đang được sử dụng tuy nhiên bạn có thể sử dụng sp_detach_dbquy trình được lưu trữ nếu bạn muốn xóa cơ sở dữ liệu khỏi máy chủ mà không xóa các tệp cơ sở dữ liệu.


0

chỉ cần đổi tên DB (được xóa) đã làm thủ thuật cho tôi. nó thoát khỏi bất kỳ quá trình nào đang truy cập cơ sở dữ liệu, và vì vậy tôi có thể bỏ cơ sở dữ liệu.


0

Đi tới phần cơ sở dữ liệu có sẵn và chọn cái. Sau đó, hãy thử DROP DATABASE the_DB_name.


0

Để xóa cơ sở dữ liệu ngay cả khi nó đang chạy, bạn có thể sử dụng tệp lô này

@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

Màn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.