Не вдається скинути базу даних, оскільки вона зараз використовується


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. студія: Клацніть правою кнопкою миші на базі даних: Властивості -> Параметри -> Обмежити доступ: встановіть значення "Однокористувацький" і виконайте падіння згодом.
AceAlfred

invoke-sqlcmd -ServerInstance localhost 'exec sp_who' | where-object {$ _. dbname -eq 'myDbName'} нічого не повертає. Але це поки скаржиться. Здається, це насправді не працює.
Pxtl

112

перед тим, як скинути базу даних, ви спочатку відмовляєтесь від підключення до цієї бази даних.

Я знайшов рішення за адресою 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 Цікаво, чому ви цього не отримали раніше, це дуже зручна відповідь. Дякую
Мехді ЛАМРАНІ

Чи це не приведе і до процесів, що не стосуються користувачів?
monksy

Для мене з'являється помилка "Команда KILL не може використовуватися всередині транзакцій користувача".
Еллі

Якщо транзакція викликає проблему, не використовуйте транзакцію.
Дон Роллінг

FYI, здається, це робить те, що ви сказали, але це не вирішує мене.
Дон Роллінг

42

Для сервера SQL mgmt. студія:

Клацніть правою кнопкою миші на базі даних: Властивості -> Параметри -> Обмежити доступ: встановіть значення «Однокористувацький» та виконайте падіння згодом


Якщо ви хочете видалити базу даних прямо із Management Studio, це найбільш інтуїтивне рішення. Дякую.
Андре Пена,

Я зробив це, а потім використав 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]
Тхан Чунг

1
@ ThànhChungBùi те, на що ти вказав, вирішило мою проблему. Це повинно бути включено у відповіді. Дякую.
Шахряр Салюгі

29

У SQL Server Management Studio 2016 виконайте такі дії:

  • Клацніть правою кнопкою миші на базі даних

  • Клацніть видалити

  • Перевірте тісні існуючі з'єднання

  • Виконайте операцію видалення


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

(Замініть "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;
Hidayat

6

Якщо ви скидаєте базу даних у SQL Management Studio і отримуєте повідомлення, не забувайте, що ви використовуєте Master як вибрану базу даних, інакше ваш запит також є підключенням до бази даних.

USE Master;
GO
DROP DATABASE AdventureWorks;
GO

У моєму випадку у мене було більше 1 з'єднання з DB II, яке я хотів відмовити.
AlexMelw

3

Обхідним шляхом грубої сили може бути:

  1. Зупиніть службу SQL Server.

  2. Видаліть відповідні файли .mdf та .ldf.

  3. Запустіть службу SQL Server.

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

1

Використовуючи MS SQL Server 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 Server Management Studio виписує і що, здається, працює для мене. Єдине, що я зробив інакше,USE [master] IF EXISTS(SELECT * FROM sys.databases WHERE name = 'Database_Name') BEGIN -- your script here END
загорнув

1

Просто хотів дати vb.net (як і з мовою c, якщо хочете конвертувати ..) У мене була подібна проблема з видаленням однієї з моїх програм, скидання БД було трохи складним, так, могло змусити користувачів зайти на сервер, кинути його за допомогою 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 #, оскільки воно позначене таким чином.
Матіас Ліккегор Лоренцен,

@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

просто перейменування БД (для видалення) зробило для мене фокус. він вийшов з-під утримання будь-якого процесу доступу до бази даних, і тому я зміг скинути базу даних.


0

Перейдіть до розділу доступних баз даних і виберіть майстер. Тоді спробуйте ВПАДАТИ БАЗУ ДАНИХ_назва_БД.


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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.