Tidak dapat melepaskan database karena sedang digunakan

91

Saya ingin menjatuhkan database. Saya telah menggunakan kode berikut, tetapi tidak berhasil.

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

Saya mendapatkan Error karena tidak dapat menghapus database karena sedang digunakan . Tolong bantu saya dalam masalah yang disebutkan di atas.

sachin kulkarni
sumber

Jawaban:

56

Seseorang terhubung ke database. Cobalah untuk beralih ke database lain dan kemudian, untuk menjatuhkannya:

Mencoba

SP_WHO untuk melihat siapa yang terhubung

dan KILLjika diperlukan

Gregory Nozik
sumber
16
Untuk manajemen server SQL. studio: Klik kanan database: Properties -> Options -> Restrict Access: Setel ke "Single User" dan lakukan penurunan setelahnya.
AceAlfred
invoke-sqlcmd -ServerInstance localhost 'exec sp_who' | di mana-objek {$ _. dbname -eq 'myDbName'} tidak menghasilkan apa-apa. Namun itu sampai mengeluh. Ini sepertinya tidak benar-benar berhasil.
Pxtl
1
@AceAlfred Yours adalah yang termudah di antara semuanya. Seharusnya menjadi salah satu jawabannya. Terima kasih.
Amit Ray
114

sebelum menjatuhkan database, Anda memutuskan koneksi ke database itu terlebih dahulu.

Saya telah menemukan solusinya di 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)
anak laki-laki yang tidak diatur
sumber
1
+1 Saya ingin tahu mengapa Anda tidak mendapatkan ini sebelumnya, ini adalah jawaban yang sangat berguna. Terima kasih
Mehdi LAMRANI
Bukankah itu akan membawa proses non-pengguna juga?
biarawan
Bagi saya, saya mendapatkan kesalahan "Perintah KILL tidak dapat digunakan di dalam transaksi pengguna."
Sekutu
Jika transaksi menyebabkan masalah, jangan gunakan transaksi tersebut.
Don Rolling
FYI, ini tampaknya melakukan apa yang Anda katakan, tetapi tidak menyelesaikan masalah untuk saya.
Don Rolling
44

Untuk manajemen server SQL. studio:

Klik kanan database: Properties -> Options -> Restrict Access: Setel ke "Single User" dan lakukan drop setelahnya

AceAlfred
sumber
Jika Anda ingin menghapus database langsung dari Studio Manajemen, ini adalah solusi paling intuitif. Terima kasih.
André Pena
Saya melakukannya, dan kemudian digunakan drop database myDatabase. Itu tidak menyelesaikan masalah. kesalahan yang sama ( ... it is currently is use) terjadi.
Shahryar Saljoughi
41

Sudah terlambat, tapi mungkin berguna untuk pengguna di masa mendatang.

Anda dapat menggunakan kueri di bawah ini sebelum menjatuhkan kueri database:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

Ini akan berhasil. Anda juga bisa merujuk ke

Bagaimana cara menentukan "tutup koneksi yang ada" dalam skrip sql

Saya harap ini akan membantu Anda :)

Hitesh
sumber
1
jangan lupa untuk menambahkan ini di awal use master go juga jika saat ini Anda memilih [MyDatabase]
Thành Chung Bùi
1
@ ThànhChungBùi apa yang Anda tunjuk memecahkan masalah saya. Itu harus dimasukkan dalam jawaban. Terima kasih.
Shahryar Saljoughi
31

Di SQL Server Management Studio 2016, lakukan hal berikut:

  • Klik kanan pada database

  • Klik hapus

  • Periksa koneksi dekat yang ada

  • Lakukan operasi hapus

Shashi Dhar
sumber
22
select * from sys.sysprocesses where dbid = DB_ID('Test')

(Ganti 'Test' dengan nama database yang Anda coba jatuhkan) Ini akan memberi tahu Anda proses mana yang menggunakannya.

Jika Anda masih ingin memaksa jatuh, pendekatan utamanya adalah:

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

Semoga ini membantu !

Raza
sumber
1
Anda Pak menyelamatkan hari saya;) Tidak ada hal di atas yang berhasil dalam kasus saya, saran Anda bekerja seperti yang dijelaskan!
Dimitri
8

Pertama, buat basis data Anda offline setelah itu lepaskan misalnya

Use Master
GO
ALTER DATABASE dbname SET OFFLINE
GO
EXEC sp_detach_db 'dbname', 'true'
Abhishek Upadhyay
sumber
Saya tidak berpikir tindakan menghapus database.
snp.it
2
setelah melepaskan database sekarang siap untuk dihapus dengan query ini. DROP DATABASE dbname;
Hidayat Arghandabi
7

Jika Anda menjatuhkan database di SQL Management Studio dan Anda mendapatkan pesan, jangan lupa bahwa Anda menggunakan Master sebagai database yang dipilih, jika tidak, kueri Anda juga merupakan koneksi ke database.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO
LockTar
sumber
Saya kasus saya, saya memiliki lebih dari 1 koneksi ke DB II ingin turun.
AlexMelw
3

Solusi kekerasan dapat berupa:

  1. Hentikan Layanan SQL Server.

  2. Hapus file .mdf dan .ldf yang sesuai.

  3. Mulai Layanan SQL Server.

  4. Hubungkan dengan SSMS dan hapus database.

HerbalMart
sumber
Ini bekerja untuk saya. Terima kasih. Saya pikir masalahnya adalah hard drive eksternal. Saya mengalihkan file ke disk lokal. Terima kasih atas solusinya.
InfZero
2

Saya ingin mengatakan bahwa saya menggunakan skrip yang berasal dari dua jawaban di bawah ini.

Alat peraga untuk @Hitesh Mistry dan @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]]]
Don Rolling
sumber
2

Pertama, periksa database yang terhubung

SP_WHO

Kedua Putuskan koneksi database Anda

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)

AKHIRNYA DROP IT

drop database your_database
Sajid khan
sumber
1

Menggunakan MS SQL Server 2008, dalam dialog DELETE dengan opsi Tutup koneksi, ini adalah skrip yang dihasilkan, saya rasa ini yang terbaik:

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
Luke Vo
sumber
Inilah yang skrip SQL Server Management Studio dan apa yang terjadi pada saya. Satu-satunya hal yang saya lakukan secara berbeda adalah membungkus semua itu di dalamUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson
1

Hanya ingin memberikan vb.net (seperti dengan bahasa c jika ingin mengkonversi ..) Saya mengalami masalah yang sama untuk uninstal salah satu program saya, menjatuhkan DB agak rumit, ya bisa membuat pengguna masuk ke server menjatuhkannya menggunakan Express, tapi itu tidak bersih, setelah beberapa melihat sekeliling mendapat sedikit kode yang sempurna bersama ...

    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

Semoga ini bisa membantu siapa pun yang mencari xChickenx

UPDATE Menggunakan ini konverter sini adalah versi 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);
        }
    }
Ayam
sumber
Pertanyaan tersebut membutuhkan respons C #, karena diberi tag seperti itu.
Mathias Lykkegaard Lorenzen
@MathiasLykkegaardLorenzen ada beberapa aplikasi freeware yang dapat menerjemahkan kode NET ke semua bahasa. Bahkan ada aplikasi online.
Ognyan Dimitrov
1
Poin diambil. Saya akan mengubah suara saya, tetapi saya tidak bisa, karena terkunci.
Mathias Lykkegaard Lorenzen
IDE BURUK! Menghapus database saat offline tidak akan menghapus file database! Meskipun ini mungkin berguna dalam beberapa kasus khusus, ini bukanlah pola yang harus Anda ikuti secara membabi buta. Masalah: a) disk Anda terisi dan b) Anda mungkin mengalami masalah saat mencoba membuat ulang database menggunakan file fisik yang sama.
Stefan Steinegger
1

Untuk menghapus database meskipun sedang berjalan, Anda dapat menggunakan file batch ini

@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

Layar

Alper Ebicoglu
sumber
Ide dengan mode pengguna tunggal tampaknya menjadi cara terbersih untuk melakukannya.
Gucu112
0

Anda tidak bisa menjatuhkan database yang sedang digunakan namun Anda bisa menggunakan sp_detach_dbprosedur tersimpan jika Anda ingin menghapus database dari server tanpa menghapus file database.

adatapost
sumber
0

hanya mengganti nama DB (untuk dihapus) melakukan trik untuk saya. itu menghentikan proses apa pun yang mengakses database, jadi saya bisa melepaskan database.

AceMark
sumber
0

Masuk ke bagian database yang tersedia dan pilih master. Kemudian Coba DROP DATABASE the_DB_name.


sumber