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?

Vikram Bose
sumber
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
Cumi-cumi
sumber
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
Samiey Mehdi
sumber
@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 .

Justin Woodmancy
sumber
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

Andrey Gordeev
sumber
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
t_plusplus
sumber
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

slayernoah
sumber
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

K GANGA
sumber
0

Cara lain untuk menutup semua koneksi:

Alat Administratif> Lihat Layanan Lokal

Hentikan / Mulai layanan "SQL Server (MSSQLSERVER)"

Chronozoa
sumber
-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
KamalDeep
sumber
Ini adalah jawaban yang sama persis dengan Squid
reggaeguitar