SQL Server 2008 R2'de veritabanını yeniden adlandırma hatası


164

Veritabanını yeniden adlandırmak için bu sorguyu kullanıyorum:

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

Ancak eklerken bir hata gösteriyor:

Msg 5030, Seviye 16, Durum 2, Hat 1
Veritabanı sadece işlemi gerçekleştirmek için kilitlenemedi.

Sorgumla ilgili bir sorun mu var?


4
Sorguda yanlış bir şey yok - hata, diğer bağlantıların veritabanına bağlı olduğunu söylüyor, bu nedenle şu anda yeniden adlandırmanıza izin verilmiyor.
Damien_The_Unbeliever

1
Bunu SSMS'den yapıyorsanız, bu db'ye karşı açık bir sorgu penceresi olmadığından emin olun, çünkü bu db'ye kilit yerleştiren ayrı bir bağlantıdır.
jleach

Yanıtlar:


330

Veritabanını tek kullanıcı moduna ayarlamayı deneyebilirsiniz.

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
olduğunu WITH ROLLBACK IMMEDIATEgerekli. Eğer hiç kullanmazsam, sorunlara neden olur mu?
user13892

Partiye biraz geç, ancak bu soruya cevap vermek için: evet, WITH ROLLBACK IMMEDIATEbu işlemlerin bütünlüğünü sağlamak için diğer kullanıcıların üzerinde çalışabileceği bir veritabanını değiştirirken kullanmalısınız . Ancak, veritabanı zaten SINGLE_USER modunda olduğundan ve yine de herhangi bir işlemi çalıştırabilen tek kullanıcı siz olduğunuz için veritabanını tekrar MULTI_USER moduna geri ayarlamak gerçekten gerekli değildir.
Hakan Yıldız

61
  1. Veritabanını tek moda ayarlayın:

    ALTER DATABASE dbName
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    
  2. Veritabanını yeniden adlandırmayı deneyin:

    ALTER DATABASE dbName MODIFY NAME = NewName
  3. Veritabanını Çok kullanıcılı moda ayarlayın:

    ALTER DATABASE NewName
    SET MULTI_USER WITH ROLLBACK IMMEDIATE
    

@SamieyMehdi Çok WITH ROLLBACk IMMEDIATEkullanıcılı için mi kullanmalıyım ?
BendEg

29

In SQL Server Management Studio (SSMS) :

Ayrıca Nesne Gezgini'nde veritabanınızı sağ tıklatıp Özellikler'e gidebilirsiniz . Oradan Seçenekler'e gidin . Tamamen aşağı kaydırın ve Erişimi Kısıtla'yı SINGLE_USER olarak ayarlayın . Veritabanı adınızı değiştirin, sonra tekrar girin ve MULTI_USER olarak ayarlayın .


Çabuk ve kolay!
ani627

Mükemmel. SQL Server 2017 ile çalışma
Adam Macierzyński

19

Önce veritabanınızla olan tüm bağlantıları kapatmayı deneyin:

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

Buradan alındı


4

Bu benim için yaptı:

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

Veritabanını diğer yanıtlarda gösterildiği gibi tek kullanıcı moduna değiştirin

Bazen, tek kullanıcı moduna dönüştürüldükten sonra bile, veritabanına izin verilen tek bağlantı kullanımda olabilir.

Tek kullanıcı moduna dönüştürdükten sonra bile bir bağlantıyı kapatmak için şunu deneyin:

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

Sonuçlara ve söz konusu veritabanına olan bağlantının kimliğine bakın.

Ardından bu bağlantıyı kapatmak için aşağıdaki komutu kullanın (veritabanı artık tek kullanıcı modunda olduğu için yalnızca bir tane olmalıdır)

KILL bağlantısı_kimliği

Connection_id öğesini 1. sorgunun sonuçlarındaki kimlikle değiştirin


1

1. veritabanı 1. tek kullanıcı modunu ayarlama

ALTER DATABASE BOSEVIKRAM SET GERİ DÖNÜŞ SINGLE_USER

2. VERİTABANI

ALTER DATABASE BOSEVIKRAM ADI DEĞİŞTİR = [BOSEVIKRAM_Deleted]

3. VERİTABANI MULIUSER MODU SET

ALTER DATABASE BOSEVIKRAM_BİLGİ TOPLAMA İLE MULTI_USER SİLİNDİ


0

Tüm bağlantıları kapatmanın başka bir yolu:

Yönetimsel Araçlar> Yerel Hizmetleri Görüntüle

"SQL Server (MSSQLSERVER)" hizmetini durdurma / başlatma


-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

Bu Squid's ile tam olarak aynı cevap
reggaeguitar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.