Kesalahan saat mengubah nama basis data di SQL Server 2008 R2


164

Saya menggunakan permintaan ini untuk mengubah nama basis data:

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

Tapi itu menunjukkan kesalahan saat mengeluarkan:

Msg 5030, Level 16, Negara 2, Baris 1
Basis data tidak dapat dikunci secara eksklusif untuk melakukan operasi.

Apakah ada yang salah dengan permintaan saya?


4
Tidak ada yang salah dengan kueri - kesalahannya memberi tahu Anda bahwa koneksi lain terhubung ke database, jadi Anda tidak diizinkan untuk mengganti namanya saat ini.
Damien_The_Unbeliever

1
Jika Anda melakukan ini dari SSMS, pastikan Anda tidak memiliki jendela permintaan terbuka terhadap db itu, karena itu adalah koneksi terpisah yang menempatkan kunci pada db.
jleach

Jawaban:


329

Anda dapat mencoba mengatur basis data ke mode pengguna tunggal.

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
adalah WITH ROLLBACK IMMEDIATEdiperlukan. Jika saya tidak menggunakannya sama sekali, apakah itu akan menyebabkan masalah?
user13892

Agak terlambat ke pesta, tetapi untuk menjawab pertanyaan ini: ya, Anda harus menggunakan WITH ROLLBACK IMMEDIATEsaat mengubah database yang mungkin dioperasikan pengguna lain, untuk memastikan integritas operasi ini. Tetapi itu tidak benar-benar diperlukan ketika mengatur database kembali ke mode MULTI_USER lagi karena database sudah dalam mode SINGLE_USER dan Anda adalah satu-satunya pengguna tetap dapat melakukan transaksi apa pun.
Hakan Yildizhan

61
  1. Atur basis data ke mode tunggal:

    ALTER DATABASE dbName
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  2. Cobalah untuk mengubah nama basis data:

    ALTER DATABASE dbName MODIFY NAME = NewName
  3. Setel basis data ke mode Multiuser:

    ALTER DATABASE NewName
    SET MULTI_USER WITH ROLLBACK IMMEDIATE

@SamieyMehdi Haruskah saya gunakan WITH ROLLBACk IMMEDIATEuntuk multiuser?
BendEg

29

Dalam SQL Server Management Studio (SSMS) :

Anda juga bisa mengklik kanan basis data Anda di Object Explorer dan pergi ke Properties . Dari sana, pergi ke Opsi . Gulirkan sepenuhnya ke bawah dan atur Batasi Akses ke SINGLE_USER . Ubah nama database Anda, lalu kembali dan atur kembali ke MULTI_USER .


Cepat dan mudah!
ani627

Itu sempurna. Bekerja dengan SQL Server 2017
Adam Macierzyński

19

Coba tutup semua koneksi terlebih dahulu ke basis data Anda:

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

Diambil dari sini


4

Ini melakukannya untuk saya:

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

Ubah database ke mode pengguna tunggal seperti yang ditunjukkan dalam jawaban lain

Terkadang, bahkan setelah mengonversi ke mode satu pengguna, satu-satunya koneksi yang diizinkan ke basis data mungkin sedang digunakan.

Untuk menutup koneksi bahkan setelah mengonversi ke mode pengguna tunggal coba:

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

Lihatlah hasilnya dan lihat ID koneksi ke database yang dimaksud.

Kemudian gunakan perintah di bawah ini untuk menutup koneksi ini (seharusnya hanya ada satu karena database sekarang dalam mode pengguna tunggal)

KILL connection_ID

Ganti connection_id dengan ID di hasil permintaan 1


1

1.database mengatur mode pengguna tunggal ke-1

ALTER DATABASE BOSEVIKRAM SET SINGLE_USER DENGAN ROLLBACK SEGERA

2. Ubah nama DATABASE

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

3. DATABAE MENYETEL MODEL MULIUSER

ALTER DATABASE BOSEVIKRAM_DITETULKAN SET MULTI_USER DENGAN ROLLBACK SEGERA


0

Cara lain untuk menutup semua koneksi:

Alat Administratif> Lihat Layanan Lokal

Hentikan / Mulai layanan "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

Ini adalah jawaban yang sama persis dengan Squid
reggaeguitar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.