ALTER DATABASE не удалось, поскольку блокировка не может быть помещена в базу данных

Мне нужно перезапустить базу данных, потому что некоторые процессы не работают. Мой план состоит в том, чтобы снова отключить его и снова вернуться в Интернет.

Я пытаюсь сделать это в Sql Server Management Studio 2008:

use master;
go
alter database qcvalues
set single_user
with rollback immediate;
alter database qcvalues
set multi_user;
go

Я получаю следующие ошибки:

Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
Msg 5061, Level 16, State 1, Line 4
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 4
ALTER DATABASE statement failed.

Что я делаю неправильно?

Ответ 1

После получения ошибки запустите

EXEC sp_who2

Найдите базу данных в списке. Возможно, соединение не было прекращено. Если вы обнаружите какие-либо соединения с базой данных, запустите

KILL <SPID>

где <SPID> - это идентификатор SPID для сеансов, подключенных к базе данных.

Попробуйте выполнить script после удаления всех связей с базой данных.

К сожалению, у меня нет причины, почему вы видите проблему, но вот ссылка, которая показывает, что проблема произошла в другом месте.

http://www.geakeit.co.uk/2010/12/11/sql-take-offline-fails-alter-database-failed-because-a-lock-could-not-error-5061/

Ответ 2

Мне удалось воспроизвести эту ошибку, выполнив следующие действия.

Соединение 1 (не работает в течение нескольких минут)

CREATE DATABASE TESTING123
GO

USE TESTING123;

SELECT NEWID() AS X INTO FOO
FROM sys.objects s1,sys.objects s2,sys.objects s3,sys.objects s4 ,sys.objects s5 ,sys.objects s6

Соединения 2 и 3

set lock_timeout 5;

ALTER DATABASE TESTING123 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

Ответ 4

В SQL Management Studio перейдите в раздел Безопасность → Логины и дважды щелкните свой Логин. Выберите "Роли сервера" в левом столбце и убедитесь, что установлен системный администратор.

В моем случае я был зарегистрирован на учетной записи без этой привилегии.

НТН!

Ответ 5

Убивание идентификатора процесса сработало для меня. При запуске команды "EXEC sp_who2" над новым окном запросов... и фильтрации результатов для "занятой" базы данных, убийство процессов с помощью команды "KILL" удалось сделать трюк. После этого все снова работало.

Ответ 6

Просто добавь два цента. Я поставил себя в ту же ситуацию, при поиске минимально необходимых привилегий для входа в db для успешного выполнения инструкции:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

Кажется, что оператор ALTER завершает успешно, когда выполняется с именем sysadmin, но для этого требуется часть очистки подключений, когда выполняется под логином, который имеет "только" ограниченные разрешения, такие как:

ALTER ANY DATABASE

P.S. Я потратил часы, пытаясь понять, почему "ALTER DATABASE.." не работает, когда выполняется под учетной записью, которая имеет привилегии dbcreator role + ALTER ANY DATABASE. Здесь мой поток MSDN!

Ответ 7

Я знаю, что это старый пост, но я недавно столкнулся с очень похожими проблемами. К сожалению, я не смог использовать какие-либо команды alter database, потому что нельзя было установить исключительную блокировку. Но я никогда не мог найти открытую связь с db. В конечном итоге мне пришлось принудительно удалить состояние работоспособности базы данных, чтобы принудительно включить ее в восстановительное состояние, а не в восстановление.