Błąd podczas zmiany nazwy bazy danych w programie SQL Server 2008 R2


164

Używam tego zapytania, aby zmienić nazwę bazy danych:

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

Ale pokazuje błąd podczas wykonywania:

Msg 5030, poziom 16, stan 2, wiersz 1
Nie można zablokować bazy danych na wyłączność w celu wykonania operacji.

Czy coś jest nie tak z moim zapytaniem?


4
Nie ma nic złego w zapytaniu - błąd informuje, że inne połączenia są połączone z bazą danych, więc w tej chwili nie możesz zmienić jej nazwy.
Damien_The_Unbeliever

1
Jeśli robisz to z poziomu SSMS, upewnij się, że nie masz otwartego okna zapytania dla tej bazy danych, ponieważ jest to oddzielne połączenie, które nakłada blokadę na bazę danych.
jleach

Odpowiedzi:


329

Możesz spróbować ustawić bazę danych w trybie pojedynczego użytkownika.

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
jest WITH ROLLBACK IMMEDIATEkonieczne. Jeśli w ogóle go nie użyję, czy spowoduje to problemy?
user13892,

Trochę za późno na imprezę, ale odpowiadając na to pytanie: tak, powinieneś użyć WITH ROLLBACK IMMEDIATEpodczas zmiany bazy danych, na której mogą pracować inni użytkownicy, aby zapewnić integralność tych operacji. Ale nie jest to konieczne przy ponownym ustawianiu bazy danych w trybie MULTI_USER, ponieważ baza danych jest już w trybie SINGLE_USER i i tak jesteś jedynym użytkownikiem, który może wykonywać jakiekolwiek transakcje.
Hakan Yildizhan

61
  1. Ustaw bazę danych w trybie pojedynczym:

    ALTER DATABASE dbName
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    
  2. Spróbuj zmienić nazwę bazy danych:

    ALTER DATABASE dbName MODIFY NAME = NewName
  3. Ustaw bazę danych w trybie wielu użytkowników:

    ALTER DATABASE NewName
    SET MULTI_USER WITH ROLLBACK IMMEDIATE
    

@SamieyMehdi Czy powinienem używać WITH ROLLBACk IMMEDIATEdla wielu użytkowników?
BendEg

29

W programie SQL Server Management Studio (SSMS) :

Możesz także kliknąć bazę danych prawym przyciskiem myszy w Eksploratorze obiektów i przejść do Właściwości . Następnie przejdź do opcji . Przewiń do samego końca i ustaw Ogranicz dostęp do SINGLE_USER . Zmień nazwę bazy danych, a następnie wróć i ustaw ją z powrotem na MULTI_USER .


Szybko i łatwo!
ani627

To idealne. Praca z SQL Server 2017
Adam Macierzyński

19

Spróbuj najpierw zamknąć wszystkie połączenia z bazą danych:

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

Zaczerpnięte stąd


4

To zrobiło to dla mnie:

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

Zmień bazę danych na tryb pojedynczego użytkownika, jak pokazano w innych odpowiedziach

Czasami nawet po konwersji do trybu pojedynczego użytkownika może być używane jedyne dozwolone połączenie z bazą danych.

Aby zamknąć połączenie nawet po konwersji do trybu pojedynczego użytkownika, spróbuj:

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

Spójrz na wyniki i zobacz identyfikator połączenia z daną bazą danych.

Następnie użyj poniższego polecenia, aby zamknąć to połączenie (powinno być tylko jedno, ponieważ baza danych jest teraz w trybie pojedynczego użytkownika)

KILL identyfikator_połączenia

Zastąp connection_id identyfikatorem w wynikach pierwszego zapytania


1

1. baza danych ustawia pierwszy tryb pojedynczego użytkownika

ALTER DATABASE BOSEVIKRAM SET SINGLE_USER Z NATYCHMIASTOWYM ROLLBACK

2. ZMIEŃ NAZWĘ BAZY DANYCH

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

3. USTAWIENIA DANYCH TRYBU MULIUSERA

ALTER DATABASE BOSEVIKRAM_Deleted USTAW MULTI_USER Z ROLLBACK NATYCHMIAST


0

Inny sposób na zamknięcie wszystkich połączeń:

Narzędzia administracyjne> Wyświetl usługi lokalne

Zatrzymaj / uruchom usługę „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

To jest dokładnie ta sama odpowiedź, co Squid
reggaeguitar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.