Помилка перейменування бази даних у SQL Server 2008 R2


164

Я використовую цей запит для перейменування бази даних:

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

Але він показує помилку при вилученні:

Msg 5030, рівень 16, стан 2, рядок 1
База даних не могла бути виключно заблокована для виконання операції.

Чи щось не так у моєму запиті?


4
У запиті нічого поганого - помилка повідомляє вам, що до бази даних підключені інші з'єднання, тому наразі вам не дозволяється перейменовувати його.
Damien_The_Unbeliever

1
Якщо ви робите це з SSMS, переконайтеся, що у вас немає відкритого вікна запиту проти цього db, оскільки це окреме з'єднання, яке встановлює замок на db.
jleach

Відповіді:


329

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

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 (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 SET SINGLE_USER З ROLLBACK IMMEDIATE

2.РЕНІМУЙТЕ БАНКУ

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

3. РЕЖИМ МУЛЮЗЕРУ НАДАТАБА

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER З ROLLBACK IMMEDIATE


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

Це точно така ж відповідь, як і кальмари
reggaeguitar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.