ไม่สามารถวางฐานข้อมูลได้เนื่องจากมีการใช้งานอยู่


91

ฉันต้องการวางฐานข้อมูล ฉันใช้รหัสต่อไปนี้แล้ว แต่ไม่มีประโยชน์

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

ฉันได้รับข้อผิดพลาดเนื่องจากไม่สามารถวางฐานข้อมูลได้เนื่องจากมีการใช้งานอยู่ โปรดช่วยฉันในปัญหาที่กล่าวถึงข้างต้น

คำตอบ:


56

มีคนเชื่อมต่อกับฐานข้อมูล ลองเปลี่ยนไปใช้ฐานข้อมูลอื่นแล้วปล่อย:

ลอง

SP_WHO เพื่อดูว่าใครเชื่อมต่อ

และKILLถ้าจำเป็น


16
สำหรับ SQL server mgmt. สตูดิโอ: คลิกขวาที่ฐานข้อมูล: คุณสมบัติ -> ตัวเลือก -> จำกัด การเข้าถึง: ตั้งค่าเป็น "ผู้ใช้คนเดียว" และดำเนินการลดลงในภายหลัง
AceAlfred

เรียกใช้ sqlcmd -ServerInstance localhost 'exec sp_who' | โดยที่วัตถุ {$ _. dbname -eq 'myDbName'} ไม่ส่งคืนค่าอะไรเลย ถึงกระนั้นก็ยังบ่น ดูเหมือนจะไม่ได้ผลจริง
Pxtl

1
@AceAlfred Yours เป็นสิ่งที่ง่ายที่สุดในบรรดา น่าจะเป็นหนึ่งในคำตอบ ขอบคุณ.
Amit Ray

114

ก่อนที่จะวางฐานข้อมูลคุณต้องยกเลิกการเชื่อมต่อกับฐานข้อมูลนั้นก่อน

ฉันพบวิธีแก้ปัญหาที่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 ฉันสงสัยว่าทำไมคุณไม่ได้รับสิ่งนี้ก่อนหน้านี้นี่เป็นคำตอบที่มีประโยชน์มาก ขอบคุณ
Mehdi LAMRANI

นั่นจะไม่นำกระบวนการที่ไม่ใช่ผู้ใช้เข้ามาด้วยหรือ?
พระสงฆ์

สำหรับฉันฉันได้รับข้อผิดพลาด "คำสั่ง KILL ไม่สามารถใช้ในธุรกรรมของผู้ใช้"
พันธมิตร

หากธุรกรรมก่อให้เกิดปัญหาอย่าใช้ธุรกรรม
Don Rolling

FYI ดูเหมือนว่าจะทำตามที่คุณบอก แต่ไม่สามารถแก้ปัญหาให้ฉันได้
Don Rolling

44

สำหรับ SQL server mgmt. สตูดิโอ:

คลิกขวาที่ฐานข้อมูล: คุณสมบัติ -> ตัวเลือก -> จำกัด การเข้าถึง: ตั้งค่าเป็น "ผู้ใช้คนเดียว" และดำเนินการลดลงในภายหลัง


หากคุณต้องการลบฐานข้อมูลโดยตรงจาก Management Studio นี่เป็นวิธีแก้ปัญหาที่ใช้งานง่ายที่สุด ขอขอบคุณ.
André Pena

drop database myDatabaseฉันไม่ได้และใช้แล้ว มันไม่ได้แก้ปัญหา เกิดข้อผิดพลาดเดียวกัน ( ... it is currently is use)
Shahryar Saljoughi

41

สายเกินไป แต่อาจเป็นประโยชน์สำหรับผู้ใช้ในอนาคต

คุณสามารถใช้แบบสอบถามด้านล่างก่อนที่จะทิ้งแบบสอบถามฐานข้อมูล:

 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สิ่งที่คุณชี้ไปแก้ปัญหาของฉัน ควรรวมอยู่ในคำตอบ ขอขอบคุณ.
Shahryar Saljoughi

31

ใน SQL Server Management Studio 2016 ให้ดำเนินการดังต่อไปนี้:

  • คลิกขวาที่ฐานข้อมูล

  • คลิกลบ

  • ตรวจสอบการปิดการเชื่อมต่อที่มีอยู่

  • ดำเนินการลบ


22
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;

หวังว่านี่จะช่วยได้!


1
คุณช่วยวันของฉัน;) ไม่มีสิ่งใดที่ได้ผลในกรณีของฉันคำแนะนำของคุณได้ผลตามที่อธิบายไว้!
Dimitri

8

ก่อนอื่นให้สร้างฐานข้อมูลของคุณแบบออฟไลน์หลังจากนั้นถอดออกเช่น

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

ฉันไม่คิดว่าการกระทำจะลบฐานข้อมูล
snp.it

2
หลังจากถอดฐานข้อมูลตอนนี้ก็พร้อมที่จะลบด้วยแบบสอบถามนี้ DROP DATABASE dbname;
Hidayat Arghandabi

7

หากคุณทิ้งฐานข้อมูลใน SQL Management Studio และคุณได้รับข้อความอย่าลืมว่าคุณใช้ Master เป็นฐานข้อมูลที่เลือกไม่เช่นนั้นแบบสอบถามของคุณจะเชื่อมต่อกับฐานข้อมูลด้วย

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

ฉันในกรณีของฉันฉันมีการเชื่อมต่อกับ DB II มากกว่า 1 รายการที่ต้องการยกเลิก
AlexMelw

3

วิธีแก้ปัญหาด้วยกำลังเดรัจฉานอาจเป็น:

  1. หยุดบริการเซิร์ฟเวอร์ SQL

  2. ลบไฟล์. mdf และ. ldf ที่เกี่ยวข้อง

  3. เริ่มบริการเซิร์ฟเวอร์ SQL

  4. เชื่อมต่อกับ SSMS และลบฐานข้อมูล


มันใช้ได้กับฉัน ขอบคุณ. ฉันคิดว่าปัญหาคือฮาร์ดไดรฟ์ภายนอก ฉันเปลี่ยนไฟล์เป็นโลคัลดิสก์ ขอบคุณสำหรับการแก้ปัญหาของคุณ
InfZero

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

2

ขั้นแรกให้ตรวจสอบฐานข้อมูลที่เชื่อมต่อ

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

1

การใช้ MS SQL Server 2008 ในกล่องโต้ตอบ DELETE พร้อมตัวเลือกการปิดการเชื่อมต่อนี่คือสคริปต์ที่สร้างขึ้นฉันเดาว่าดีที่สุด:

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 ออกสคริปต์และสิ่งที่เกิดขึ้นกับฉัน สิ่งเดียวที่ฉันทำแตกต่างออกไปคือการห่อหุ้มทั้งหมดนั้นไว้ใน aUSE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
Smitty-Werben-Jager-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

อัปเดต โดยใช้ตัวแปลงนี้ที่นี่คือเวอร์ชัน 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

@MathiasLykkegaardLorenzen มีแอพฟรีแวร์หลายตัวที่สามารถแปลรหัส. NET ในทุกภาษา มีแม้แต่แอปออนไลน์
Ognyan Dimitrov

1
จุดที่ถ่าย ฉันจะเปลี่ยนการลงคะแนนของฉัน แต่ฉันทำไม่ได้เพราะมันถูกล็อค
Mathias Lykkegaard Lorenzen

ความคิดที่ไม่ดี! การทิ้งฐานข้อมูลเมื่อเป็น offine จะไม่ลบไฟล์ฐานข้อมูล! แม้ว่าสิ่งนี้จะมีประโยชน์ในบางกรณี แต่ก็ไม่ใช่รูปแบบที่คุณควรทำตามแบบสุ่มสี่สุ่มห้า ปัญหา: a) ดิสก์ของคุณเต็มและ b) คุณอาจประสบปัญหาเมื่อพยายามสร้างฐานข้อมูลใหม่โดยใช้ไฟล์ฟิสิคัลเดียวกัน
Stefan Steinegger

1

หากต้องการลบฐานข้อมูลแม้ว่าจะทำงานอยู่คุณสามารถใช้ไฟล์แบตช์นี้ได้

@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

หน้าจอ


แนวคิดที่มีโหมดผู้ใช้คนเดียวดูเหมือนจะเป็นวิธีที่สะอาดที่สุด
Gucu112

0

คุณไม่สามารถทิ้งฐานข้อมูลที่กำลังใช้อยู่ แต่คุณสามารถใช้sp_detach_dbกระบวนงานที่เก็บไว้ได้หากคุณต้องการลบฐานข้อมูลออกจากเซิร์ฟเวอร์โดยไม่ต้องลบไฟล์ฐานข้อมูล


0

แค่เปลี่ยนชื่อ DB (ที่จะลบ) ก็เป็นเคล็ดลับสำหรับฉัน มันหลุดจากกระบวนการใดก็ตามที่เข้าถึงฐานข้อมูลดังนั้นฉันจึงสามารถทิ้งฐานข้อมูลได้


0

ไปที่ส่วนฐานข้อมูลที่มีและเลือกต้นแบบ จากนั้นลอง DROP DATABASE the_DB_name

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.