डेटाबेस को ड्रॉप नहीं कर सकता क्योंकि यह वर्तमान में उपयोग में है


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 सर्वर mgmt के लिए। स्टूडियो: राइट क्लिक डेटाबेस: गुण -> विकल्प -> पहुंच प्रतिबंधित करें: "एकल उपयोगकर्ता" पर सेट करें और बाद में ड्रॉप करें।
AceAredred

invoke-sqlcmd -ServerInstance localhost 'एक्जीक्यूट sp_who' | जहाँ-वस्तु {$ _। dbname -eq 'myDbName'} कुछ भी नहीं देता है। फिर भी यह शिकायत करता है। यह वास्तव में काम नहीं करता है।
21

112

किसी डेटाबेस को छोड़ने से पहले, आप पहले उस डेटाबेस के कनेक्शन को छोड़ देते हैं।

मुझे http://www.kodyaz.com/articles/kill-all-processes-of-a-datadia.inx पर एक समाधान मिल गया है

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

गैर-उपयोगकर्ता प्रक्रियाओं में भी नहीं लाएँगे?
भिक्षु

मेरे लिए मुझे त्रुटि मिलती है "KILL कमांड का उपयोग उपयोगकर्ता लेनदेन के अंदर नहीं किया जा सकता है।"
सहयोगी

यदि लेन-देन में समस्या आ रही है, तो लेन-देन का उपयोग न करें।
डॉन रोलिंग

FYI करें, ऐसा लगता है कि आपने जो कहा है वह होगा, लेकिन मेरे लिए इस मुद्दे को हल नहीं कर रहा है।
डॉन रोलिंग 16

42

SQL सर्वर mgmt के लिए। स्टूडियो:

डेटाबेस पर राइट क्लिक करें: गुण -> विकल्प -> पहुंच प्रतिबंधित करें: "एकल उपयोगकर्ता" पर सेट करें और बाद में ड्रॉप करें


यदि आप प्रबंधन स्टूडियो से एक डेटाबेस को हटाना चाहते हैं, तो यह सबसे सहज समाधान है। धन्यवाद।
आंद्रे पेना

मैंने इसे किया, और फिर इस्तेमाल किया drop database myDatabase। यह समस्या हल नहीं हुई। वही त्रुटि ( ... it is currently is use) खुश हुई।
शाहरयार सज्जोई

40

बहुत देर हो चुकी है, लेकिन यह भविष्य के उपयोगकर्ताओं के लिए उपयोगी हो सकता है।

डेटाबेस क्वेरी छोड़ने से पहले आप नीचे दिए गए क्वेरी का उपयोग कर सकते हैं:

 alter database [MyDatbase] set single_user with rollback immediate

 drop database [MyDatabase]

यह काम करेगा। आप भी देख सकते हैं

मैं sql स्क्रिप्ट में "करीब मौजूदा कनेक्शन" कैसे निर्दिष्ट कर सकता हूं

मुझे आशा है कि यह आपकी मदद करेगा :)


1
use master go यदि आप वर्तमान में [MyDatabase] का चयन करते हैं तो इसे भीख में जोड़ना न भूलें
Thành Chung B'i

1
@ ThànhChungBùi आपने मेरी समस्या का समाधान किया। इसे उत्तरों में शामिल किया जाना चाहिए। धन्यवाद।
शाहरयार सलजूफी

29

SQL सर्वर प्रबंधन स्टूडियो 2016 में, निम्न कार्य करें:

  • डेटाबेस पर राइट क्लिक करें

  • डिलीट पर क्लिक करें

  • नजदीकी मौजूदा कनेक्शन की जाँच करें

  • डिलीट ऑपरेशन करें


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

('टेस्ट' को उस डेटाबेस के नाम से बदलें जिसे आप छोड़ने की कोशिश कर रहे हैं) यह आपको बताएगा कि कौन सी प्रक्रियाएं इसका उपयोग कर रही हैं।

यदि आप अभी भी ड्रॉप करने के लिए मजबूर करना चाहते हैं, तो अंतिम दृष्टिकोण है:

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

उम्मीद है की यह मदद करेगा !


आपने सर मेरा दिन बचाया;) उपरोक्त में से कुछ भी मेरे मामले में काम नहीं किया, आपके सुझावों के अनुसार काम किया!
दिमित्री

8

पहले अपना डेटा बेस ऑफलाइन करें उसके बाद उसे अलग कर दें

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

मुझे नहीं लगता कि कार्रवाई डेटाबेस को हटाती है।
snp.it

1
डेटाबेस को अलग करने के बाद अब वह इस क्वेरी के साथ डिलीट होने के लिए तैयार है। DROP DATABASE dbname;
हिदायत अरगंडीबी

6

यदि आपका प्रबंधन SQL प्रबंधन स्टूडियो में डेटाबेस को छोड़ देता है और आपको संदेश मिलता है, तो यह मत भूलो कि आप चयनित डेटाबेस के रूप में मास्टर का उपयोग करते हैं अन्यथा आपकी क्वेरी भी डेटाबेस से एक कनेक्शन है।

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

मुझे मेरा मामला है कि मेरे पास DB II के लिए 1 से अधिक कनेक्शन था, मैं छोड़ना चाहता था।
एलेक्समेल

3

एक क्रूर बल वर्कअराउंड हो सकता है:

  1. SQL सर्वर सेवा बंद करें।

  2. इसी .mdf और .ldf फ़ाइलों को हटाएँ।

  3. SQL सर्वर सेवा प्रारंभ करें।

  4. SSMS के साथ कनेक्ट करें और डेटाबेस को हटा दें।


इससे मेरा काम बनता है। धन्यवाद। मुझे लगता है कि समस्या एक बाहरी हार्ड ड्राइव है। मैंने फ़ाइल को एक स्थानीय डिस्क पर स्विच किया। आपके समाधान के लिए धन्यवाद।
21

2

मैं यह जानना चाहता था कि मैंने एक स्क्रिप्ट का उपयोग किया है जो नीचे दिए गए दो उत्तरों से ली गई है।

@Hitesh मिस्त्री और @ruleduledboy को सहारा

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

बंद कनेक्शन विकल्पों के साथ DELETE संवाद में MS SQL सर्वर 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 सर्वर प्रबंधन स्टूडियो स्क्रिप्ट क्या है और मेरे लिए क्या होता है। केवल एक चीज मैं अलग तरह से किया था एक की है कि अंदर के सभी लपेट थाUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-Manjenson

1

बस एक vb.net देना चाहता था (सी भाषा के साथ अगर कनवर्ट करना चाहते हैं ..) मुझे अपने एक प्रोग्राम को अनइंस्टॉल करने के लिए समान समस्या हो रही थी, डीबी को छोड़ना थोड़ा मुश्किल था, हां उपयोगकर्ताओं को सर्वर ड्रॉप में जाने के लिए मिल सकता था एक्सप्रेस का उपयोग करना, लेकिन यह साफ नहीं है, कुछ के आसपास लगता है एक साथ कोड का एक छोटा सा मिल गया ...

    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 देखने में मदद करता है

अद्यतन इस कनवर्टर का उपयोग यहाँ 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 # प्रतिक्रिया की आवश्यकता है, क्योंकि यह उस तरह से टैग किया गया है।
मैथियास लिकेगार्ड लोरेंजेन

@MathiasLykkegaardLorenzen कई फ्रीवेयर ऐप हैं जो सभी भाषाओं में .NET कोड का अनुवाद कर सकते हैं। वहाँ भी ऑनलाइन क्षुधा।
ओग्यान दिमित्रोव

1
मुद्दा लेना। मैंने अपना वोट बदल दिया होगा, लेकिन मैं इसे बंद नहीं कर सकता।
मैथियास लिकेगार्ड लोरेंजेन

बुरा विचार! डेटाबेस ख़राब होने पर उसे गिराना डेटाबेस फ़ाइलों को नहीं हटाएगा! यहां तक ​​कि अगर यह कुछ विशेष मामले में उपयोगी हो सकता है, तो यह एक पैटर्न नहीं है जिसे आपको आँख बंद करके पालन करना चाहिए। समस्याएं: ए) आपकी डिस्क भर जाती है और बी) आप एक ही भौतिक फ़ाइलों का उपयोग करके डेटाबेस को फिर से बनाने की कोशिश करते समय मुद्दों में भाग सकते हैं।
स्टीफन स्टाइनगर

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

स्क्रीन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.