Şu anda kullanımda olduğu için veritabanı bırakılamıyor


91

Bir veritabanı bırakmak istiyorum. Aşağıdaki kodu kullandım, ancak boşuna.

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

Şu anda kullanımda olduğu için veritabanı bırakılamıyor olarak Hata alıyorum . Lütfen yukarıda belirtilen konuda bana yardım edin.

Yanıtlar:


56

Veritabanına bağlı biri. Başka bir veritabanına geçmeyi ve ardından bırakmayı deneyin:

Deneyin

SP_WHO kimin bağlandığını görmek için

ve KILLgerekirse


16
SQL sunucusu yönetimi için. studio: Sağ tıklama veritabanı: Özellikler -> Seçenekler -> Erişimi Kısıtla: "Tek Kullanıcı" olarak ayarlayın ve ardından bırakma işlemini gerçekleştirin.
AceAlfred

invoke-sqlcmd -ServerInstance localhost 'exec sp_who' | burada-nesne {$ _. dbname -eq 'myDbName'} hiçbir şey döndürmez. Yine de şikayet edene kadar. Bu aslında işe yaramıyor gibi görünüyor.
Pxtl

1
@AceAlfred Yours, aralarında en kolay olanıdır. Cevaplardan biri olmalıydı. Teşekkürler.
Amit Ray

114

Bir veritabanını bırakmadan önce, önce o veritabanına olan bağlantıyı kesersiniz.

Http://www.kodyaz.com/articles/kill-all-processes-of-a-database.aspx adresinde bir çözüm buldum

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 Bunu neden daha önce anlamadınız merak ediyorum, bu çok kullanışlı bir cevap. Teşekkürler
Mehdi LAMRANI

Bu, kullanıcı dışı süreçleri de beraberinde getirmeyecek mi?
monksy

Benim için "KILL komutu kullanıcı işlemlerinde kullanılamaz" hatasını alıyorum.
Ally

İşlem bir soruna neden oluyorsa, işlemi kullanmayın.
Don Rolling

Bilginize, bu sizin söylediğiniz şeyi yapıyor gibi görünüyor, ancak sorunu benim için çözmüyor.
Don Rolling

44

SQL sunucusu yönetimi için. stüdyo:

Sağ tıklama veritabanı: Özellikler -> Seçenekler -> Erişimi Kısıtla: "Tek Kullanıcı" olarak ayarlayın ve ardından bırakma işlemini gerçekleştirin


Bir veritabanını doğrudan Management Studio'dan silmek istiyorsanız, bu en sezgisel çözümdür. Teşekkür ederim.
André Pena

Yaptım ve sonra kullandım drop database myDatabase. Sorunu çözmedi. aynı hata ( ... it is currently is use) oluştu.
Shahryar Saljoughi

41

Çok geç, ancak gelecekteki kullanıcılar için faydalı olabilir.

Veritabanı sorgusunu bırakmadan önce aşağıdaki sorguyu kullanabilirsiniz:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

Çalışacak. Ayrıca şunlara da başvurabilirsiniz

Sql komut dosyasında "mevcut bağlantıları kapat" seçeneğini nasıl belirtebilirim

Umarım bu sana yardımcı olur :)


1
başında bu eklemeyi unutmayın use master go şu anda seçerseniz yanı [MyDatabase]
Thành Chung Bùi

1
@ ThànhChungBùi ne işaret ettiğinizi sorunumu çözdü. Cevaplara dahil edilmelidir. Teşekkür ederim.
Shahryar Saljoughi

31

SQL Server Management Studio 2016'da aşağıdakileri gerçekleştirin:

  • Veritabanına sağ tıklayın

  • Sil'i tıklayın

  • Mevcut bağlantıları kapatın

  • Silme işlemini gerçekleştirin


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

(Bırakmaya çalıştığınız veritabanının adıyla 'Test'i değiştirin) Bu size hangi işlemlerin onu kullandığını söyleyecektir.

Hala düşürmeye zorlamak istiyorsanız, nihai yaklaşım şudur:

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

Bu yardımcı olur umarım !


1
Efendim günümü kurtardınız;) Yukarıdakilerden hiçbiri benim durumumda işe yaramadı, önerileriniz açıklandığı gibi çalıştı!
Dimitri

8

Öncelikle veri tabanınızı çevrimdışı yapın, ardından çıkarın, örn.

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

Eylemin veritabanını sildiğini sanmıyorum.
snp.it

2
Veritabanını çıkardıktan sonra artık bu sorgu ile silinmeye hazır. DROP DATABASE dbname;
Hidayet Arghandabi

7

Veritabanını SQL Management Studio'ya bıraktığınızda mesajı alırsanız, seçili veritabanı olarak Master'ı kullandığınızı unutmayın, aksi takdirde sorgunuz aynı zamanda veritabanına bir bağlantıdır.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

Benim durumumda 1'den fazla DB II bağlantım vardı.
AlexMelw

3

Bir kaba kuvvet geçici çözümü şunlar olabilir:

  1. SQL Server Hizmetini durdurun.

  2. Karşılık gelen .mdf ve .ldf dosyalarını silin.

  3. SQL Server Hizmetini başlatın.

  4. SSMS ile bağlanın ve veritabanını silin.


Benim için çalışıyor. Teşekkürler. Sorunun harici bir sabit disk olduğunu düşünüyorum. Dosyayı yerel bir diske çevirdim. Çözümünüz için teşekkürler.
InfZero

2

Aşağıdaki cevaplardan ikisinden türetilen bir komut dosyası kullandığımı söylemek istedim.

@Hitesh Mistry ve @unruledboy için aksesuarlar

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]]]

2

İlk önce bağlı veritabanlarını kontrol edin

SP_WHO

İkinci olarak Veritabanınızın bağlantısını kesin

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)

SONUNDA DAMLA

drop database your_database

1

MS SQL Server 2008'i kullanarak, Bağlantıyı kapat seçenekleriyle DELETE iletişim kutusunda, bu oluşturulan betiktir, sanırım en iyisi:

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'nun betik yaptığı ve benim için işe yarayan şey budur. Farklı yaptığım tek şey, hepsini birUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson

1

Sadece bir vb.net vermek istedim (dönüştürmek istiyorsanız c dilinde olduğu gibi) Programlarımdan birinin kaldırılmasıyla ilgili benzer bir sorun yaşıyordum, DB'yi düşürmek biraz zordu, evet kullanıcıların sunucuya girmesini sağlayabilirdi bırak onu Express kullanıyor, ancak bu temiz değil, birkaç bakıştan sonra mükemmel bir kod bir araya geldi ...

    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

Umarım bu xChickenx'e bakan herkese yardımcı olur

GÜNCELLEME Bu dönüştürücüyü kullanmak C # sürümüdür:

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

Bu şekilde etiketlendiği için soru C # yanıtına ihtiyaç duyar.
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen .NET kodunu tüm dillerde çevirebilen birkaç ücretsiz uygulama vardır. Çevrimiçi uygulamalar bile var.
Ognyan Dimitrov

1
Alınan nokta. Oyumu değiştirirdim ama kilitli olduğu için yapamam.
Mathias Lykkegaard Lorenzen

KÖTÜ BİR FİKİR! Bir veritabanını kapalıyken bırakmak veritabanı dosyalarını kaldırmaz! Bu bazı özel durumlarda kullanışlı olsa bile, körü körüne takip etmeniz gereken bir model değildir. Sorunlar: a) diskiniz dolar ve b) aynı fiziksel dosyaları kullanarak veritabanını yeniden oluşturmaya çalışırken sorunlarla karşılaşabilirsiniz.
Stefan Steinegger

1

Bir veritabanını çalışıyor olsa bile silmek için bu toplu iş dosyasını kullanabilirsiniz

@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

Ekran


1
Tek kullanıcı modu ile fikir, bunu yapmanın en temiz yolu gibi görünüyor.
Gucu112

0

Şu anda kullanılmakta olan bir veritabanını bırakamazsınız, ancak sp_detach_dbbir veritabanını, veritabanı dosyalarını silmeden sunucudan kaldırmak istiyorsanız, saklı yordamı kullanabilirsiniz .


0

sadece DB'yi yeniden adlandırmak (silinecek) benim için hile yaptı. Veritabanına erişen herhangi bir işlemin tutulmasından kurtuldu ve böylece veritabanını bırakabildim.


0

Mevcut veritabanları bölümüne gidin ve master'ı seçin. Sonra DROP DATABASE the_DB_name'i deneyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.