Ошибка при переименовании базы данных в SQL Server 2008 R2


164

Я использую этот запрос для переименования базы данных:

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

Но это показывает ошибку при исключении:

Сообщение 5030, уровень 16, состояние 2, строка 1
Не удалось заблокировать базу данных для выполнения операции.

Что-то не так с моим запросом?


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

1
Если вы делаете это из SSMS, убедитесь, что у вас нет окна запросов к этой базе данных, так как это отдельное соединение, которое устанавливает блокировку для базы данных.
jleach

Ответы:


330

Вы можете попробовать установить базу данных в однопользовательский режим.

https://stackoverflow.com/a/11624/2408095

use master
ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE    
ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]
ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER

1
это WITH ROLLBACK IMMEDIATEнеобходимо. Если я вообще им не пользуюсь, это вызовет проблемы?
user13892

Немного опоздал на вечеринку, но для ответа на этот вопрос: да, вы должны использовать WITH ROLLBACK IMMEDIATEпри изменении базы данных, над которой могут работать другие пользователи, чтобы обеспечить целостность этих операций. Но в действительности это не является необходимым при повторной установке базы данных в режим MULTI_USER, поскольку база данных уже находится в режиме SINGLE_USER, и вы все равно единственный пользователь, способный выполнять любые транзакции.
Хакан Йылдыжан

61
  1. Установите базу данных в одиночный режим:

    ALTER DATABASE dbName
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  2. Попробуйте переименовать базу данных:

    ALTER DATABASE dbName MODIFY NAME = NewName
  3. Установите базу данных в многопользовательский режим:

    ALTER DATABASE NewName
    SET MULTI_USER WITH ROLLBACK IMMEDIATE

@SamieyMehdi Должен ли я использовать WITH ROLLBACk IMMEDIATEдля многопользовательских?
BendEg

29

В SQL Server Management Studio (SSMS) :

Вы также можете щелкнуть правой кнопкой мыши свою базу данных в Обозревателе объектов и перейти в Свойства . Оттуда перейдите в Настройки . Прокрутите весь путь вниз и установите для параметра « Ограничить доступ» значение SINGLE_USER . Измените имя вашей базы данных, затем вернитесь и установите его обратно в MULTI_USER .


Быстро и просто!
ani627

Отлично. Работа с SQL Server 2017
Адам

19

Попробуйте сначала закрыть все соединения с вашей базой данных:

use master
ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER

Взято отсюда


4

Это сделало это для меня:

USE [master];
GO
ALTER DATABASE [OldDataBaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
EXEC sp_renamedb N'OldDataBaseName', N'NewDataBaseName';


-- Add users again
ALTER DATABASE [NewDataBaseName] SET MULTI_USER
GO


2

Переведите базу данных в однопользовательский режим, как показано в других ответах.

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

Чтобы закрыть соединение даже после перехода в однопользовательский режим, попробуйте:

select * from master.sys.sysprocesses
where spid>50 -- don't want system sessions
  and dbid = DB_ID('BOSEVIKRAM')

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

Затем используйте команду ниже, чтобы закрыть это соединение (должно быть только одно, поскольку база данных теперь находится в однопользовательском режиме)

KILL connection_ID

Замените connection_id на идентификатор в результатах 1-го запроса


1

1. база данных устанавливает 1-й однопользовательский режим

ALTER DATABASE BOSEVIKRAM УСТАНОВИЛ SINGLE_USER С ОТКРЫТИЕМ ROLLBACK

2. переименовать базу данных

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

3.DATABAE SET MULIUSER MODE

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER с немедленным отступом


0

Еще один способ закрыть все соединения:

Администрирование> Просмотр локальных сервисов

Остановить / запустить службу «SQL Server (MSSQLSERVER)»


-1
use master

ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE  

exec sp_renamedb 'BOSEVIKRAM','BOSEVIKRAM_Deleted'

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER

Это тот же самый ответ, что и у Squid
reggaeguitar
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.