Як викинути базу даних в режимі Single_User


12

Як я можу скинути базу даних, яка відображається DatabaseName (Single User)як її ім'я?

Коли я намагаюся видалити його, я отримую таку помилку:

Не вдалося змінити для бази даних "Ім'я бази даних". (Microsoft.SqlServer.Smo)

Помилка оператора ALTER DATABASE. (Microsoft SQL Server, помилка: 5064)

Я спробував виконати ALTERнаведене нижче, і все ще є той самий випуск.

ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT

Відповіді:


23

Якщо ви збираєтеся скинути базу даних, ви повинні бути єдиним підключенням до цієї бази даних. Якщо є якісь інші з'єднання, ви не можете його відмовити. З повідомлення про помилку (ця помилка означає, що ваша база даних перебуває в режимі Single_User, але вже є з’єднання, тому ви не можете підключитися). Моє припущення тут полягає в тому, що ви спробували встановити її в режимі Single_User, а потім спробували зробити краплю, але або ви схопив зв’язок, про який ви не знали, або якийсь інший процес. Той факт, що для вас спрацював перезапуск SSMS, говорить, ймовірно, ви перехопили це з'єднання. Тож ось як це можна виправити.

Логічно вам доведеться повернути базу даних у режим багатокористувача, щоб потім ви могли знову перевести її в режим однокористувача (але цього разу ви будете контролювати це єдине з'єднання, дозволене і перестане базу даних, перш ніж щось інше підключиться), і тоді ваша база даних буде не зникне.

У коді ось як це потрібно зробити ( але спочатку закрийте вікна запитів, які підключені до цієї бази даних. Перезапустіть SSMS і переконайтеся, що ви не вибрали цю базу даних в браузері об'єктів ):

-- Then attempt to take your database to multi_user mode, do this from master
USE MASTER 
GO

ALTER DATABASE myDatabaseName 
SET multi_user WITH ROLLBACK IMMEDIATE
GO

-- Now put it into single_user mode and drop it. Use Rollback Immediate to disconnect any sessions and rollback their transactions. Safe since you are about to drop the DB.
ALTER DATABASE myDatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE myDatabaseName
GO

Це рішення не працюватиме, якщо база даних вже перебуває в режимі Однокористувача, і ви спробуєте отримати доступ до неї з іншого з'єднання.
Максим Пауков

4
Правильно Максим - тому я сказав, що моє припущення, що ґрунтується на наданій інформації та самовідповіді ОП, насправді є відкритим з'єднанням, ймовірно, через провідник об’єктів або вікно запиту ... Якщо це було відкрито якимось іншим способом іншому користувачеві, то вам доведеться знайти те, що одне з'єднання, яке вкрало єдине з'єднання, дозволене, а потім знищити сеанс одного з'єднання і виконайте кроки, викладені вище ..
Майк Уолш

13

Якщо ви спробуєте отримати доступ до бази даних, яка вже перебуває в режимі однокористувача, спочатку потрібно закрити всі з'єднання з базою даних, інакше ви отримаєте повідомлення про помилку:

Msg 5064, рівень 16, стан 1, рядок 1 Зміни стану або параметрів бази даних "Ім'я бази даних" наразі неможливо вносити. База даних знаходиться в режимі однокористування, і користувач наразі підключений до неї. Повідомлення 5069, Рівень 16, Стан 1, Рядок 1 СТВЕРДЖУВАННЯ ПОНЯТЬ ДАТАБАЗУ.

Наступний запит вбиває процеси доступу до бази даних:

-- Create the sql to kill the active database connections  
declare @execSql varchar(1000), @databaseName varchar(100)  
-- Set the database name for which to kill the connections  
set @databaseName = 'DatabaseName'  

set @execSql = ''   
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '  
from    master.dbo.sysprocesses  
where   db_name(dbid) = @databaseName  
     and  
     DBID <> 0  
     and  
     spid <> @@spid  
exec(@execSql)
GO

Тоді ви зможете повернути базу даних у багатокористувацький режим як завжди:

ALTER DATABASE 'DatabaseName' SET MULTI_USER

2
Це дуже і дуже громіздке рішення і прирівнюється до розчаровуючої гри в ударах-моль у напруженій системі. Щоб вигнати всіх користувачів, набагато простіше використовувати, ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEяк показує відповідь Майка.
Аарон Бертран

1
@AaronBertrand Рішення Майка не працюватиме, якщо база даних вже перебуває в режимі Однокористувача, а ви спробуєте отримати доступ до неї з іншого з'єднання.
Максим Пауков

2
Правильно, якщо це так, йому доведеться знаходити сесії, як ви окреслили. Однак якщо зв’язок, який встановив базу даних на single_user, є його власним ...
Аарон Бертран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.