Tek_Kullanıcı Modunda Veritabanı Bırakma


12

DatabaseName (Single User)Adı olarak gösterilen bir veritabanını nasıl bırakabilirim ?

Silmeye çalıştığımda, aşağıdaki hatayı alıyorum:

Alter 'DatabaseName' Veritabanı için başarısız oldu. (Microsoft.SqlServer.smo)

ALTER DATABASE deyimi başarısız oldu. (Microsoft SQL Server, Hata: 5064)

ALTERAşağıdakileri yürütmeye çalıştım ve hala aynı sorunu yaşıyorum .

ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT

Yanıtlar:


23

Bir veritabanını bırakacaksanız, o veritabanıyla tek bağlantı olmanız gerekir. Orada başka bağlantılar varsa, onu bırakamazsınız. Hata mesajından (bu hata, veritabanınızın Single_User modunda olduğu anlamına gelir, ancak zaten bağlanamamanız için bir bağlantı olduğu anlamına gelir) burada benim varsayım, bunu Single_User moduna ayarlamaya çalışmanız ve ardından bırakmayı denemenizdir. bilmediğiniz veya başka bir işlemin yapmadığı bir bağlantı yakaladı. SSMS'yi yeniden başlatmanın sizin için işe yaradığı gerçeği bana muhtemelen bu bağlantıyı yakaladığınızı söylüyor. İşte bunu nasıl düzeltebileceğiniz.

Mantıksal olarak veritabanını çoklu kullanıcı moduna geri getirmelisiniz, böylece daha sonra tekrar single_user moduna getirebilirsiniz (ancak bu sefer izin verilen bu tek bağlantının kontrolünde olacaksınız ve başka bir şey bağlanmadan önce veritabanını bırakacaksınız) ve sonra veritabanınız Gitmiş.

Kod burada bunu nasıl yapmanız gerektiği ( ancak önce o veritabanına bağlı sorgu pencerelerini kapatın. SSMS'yi yeniden başlatın ve nesne veritabanında bu veritabanını seçmediğinizden emin olun ):

-- Then attempt to take your database to multi_user mode, do this from master
USE MASTER 
GO

ALTER DATABASE myDatabaseName 
SET multi_user WITH ROLLBACK IMMEDIATE
GO

-- Now put it into single_user mode and drop it. Use Rollback Immediate to disconnect any sessions and rollback their transactions. Safe since you are about to drop the DB.
ALTER DATABASE myDatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE myDatabaseName
GO

Veritabanı zaten Tek Kullanıcı modundaysa ve başka bir bağlantıdan erişmeye çalışırsanız bu çözüm çalışmaz.
Maxim Paukov

4
Bu doğru Maxim - Bu yüzden burada verilen bilgilere dayanarak varsayımımın ve OP'lerin kendi cevaplarının aslında açık bir bağlantıyla muhtemelen nesne gezgini veya bir sorgu penceresi üzerinden olduğunu söyledim ... diğer kullanıcı, o zaman tek bir bağlantı çaldı izin bir bağlantı bulmak ve sonra -that- bir bağlantı oturumunu öldürmek ve yukarıda özetlenen adımları takip etmek gerekir ..
Mike Walsh

13

Zaten Tek Kullanıcı modunda olan veritabanına erişmeye çalışırsanız, önce veritabanına olan tüm bağlantıları kapatmanız gerekir, aksi takdirde bir hata iletisi alırsınız:

Msg 5064, Seviye 16, Durum 1, Satır 1 'VeritabanıAdı' veritabanının durumunda veya seçeneklerinde şu anda değişiklik yapılamıyor. Veritabanı tek kullanıcı modunda ve şu anda bir kullanıcı ona bağlı. Msg 5069, Düzey 16, Durum 1, Satır 1 ALTER DATABASE deyimi başarısız oldu.

Aşağıdaki sorgu veritabanına erişen süreçleri öldürür:

-- Create the sql to kill the active database connections  
declare @execSql varchar(1000), @databaseName varchar(100)  
-- Set the database name for which to kill the connections  
set @databaseName = 'DatabaseName'  

set @execSql = ''   
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '  
from    master.dbo.sysprocesses  
where   db_name(dbid) = @databaseName  
     and  
     DBID <> 0  
     and  
     spid <> @@spid  
exec(@execSql)
GO

Ardından, veritabanını her zamanki gibi Çoklu Kullanıcı moduna getirebilmeniz gerekir:

ALTER DATABASE 'DatabaseName' SET MULTI_USER

2
Bu çok, çok hantal bir çözümdür ve yoğun bir sistemde sinir bozucu bir köstebek vuruşu oyununa eşittir. Tüm kullanıcıları dışarı atmak için ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEMike'ın cevabının gösterdiği gibi kullanımı çok daha kolay .
Aaron Bertrand

1
@AaronBertrand Veritabanı zaten Tek Kullanıcı modundaysa ve başka bir bağlantıdan erişmeye çalışırsanız Mike'ın çözümü çalışmaz.
Maxim Paukov

2
Doğru, eğer durum buysa, sizin belirttiğiniz gibi oturumları bulması gerekir. Ancak, veritabanını single_user olarak ayarlayan bağlantı kendi ise ...
Aaron Bertrand
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.