Come eliminare il database in modalità Single_User


12

Come faccio a eliminare un database che mostra DatabaseName (Single User)come il suo nome?

Quando provo a eliminarlo, viene visualizzato il seguente errore:

Modifica non riuscita per il database "DatabaseName". (Microsoft.SqlServer.Smo)

Istruzione ALTER DATABASE non riuscita. (Microsoft SQL Server, errore: 5064)

Ho provato a eseguire il ALTERseguito e ho ancora lo stesso problema.

ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT

Risposte:


23

Se stai per eliminare un database, devi essere l'unica connessione a quel database. Se ci sono altre connessioni, non è possibile rilasciarlo. Dal messaggio di errore (quell'errore significa che il tuo database è in modalità Single_User ma c'è già una connessione quindi non puoi connetterti) il mio presupposto qui è che hai provato a impostarlo in modalità Single_User e poi hai provato a fare il drop ma tu ha afferrato una connessione che non conoscevi o che ha avuto qualche altro processo. Il fatto che il riavvio di SSMS abbia funzionato per te mi dice che probabilmente hai preso quella connessione. Quindi ecco come risolverlo.

Logicamente devi riportare il database in modalità multiutente in modo da poterlo reinserire in modalità single_user (ma questa volta avrai il controllo di quella singola connessione consentita e rilasciare il database prima che qualcos'altro si connetta) e quindi il tuo database lo farà sparire.

Nel codice ecco come è necessario farlo ( ma prima chiudi le finestre delle query che sono connesse a quel database. Riavvia SSMS e assicurati di non selezionare questo database nel browser degli oggetti ):

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

Questa soluzione non funzionerà se il database è già in modalità Utente singolo e si tenta di accedervi da un'altra connessione.
Maxim Paukov,

4
Proprio così Maxim - Ecco perché ho detto che qui il mio presupposto in base alle informazioni fornite e la risposta automatica degli OP è in realtà quello con la connessione aperta probabilmente tramite Esplora oggetti o una finestra di query ... Se fosse stato aperto in qualche altro modo da alcuni altro utente, quindi dovresti trovare quella connessione che ha rubato la singola connessione consentita e quindi uccidere quella sessione di una connessione e seguire i passaggi descritti sopra ..
Mike Walsh,

13

Se si tenta di accedere al database che è già in modalità Utente singolo, è necessario chiudere prima tutte le connessioni al database, altrimenti verrà visualizzato un messaggio di errore:

Messaggio 5064, livello 16, stato 1, riga 1 Al momento non è possibile apportare modifiche allo stato o alle opzioni del database "DatabaseName". Il database è in modalità utente singolo e un utente è attualmente connesso ad esso. Messaggio 5069, livello 16, stato 1, riga 1 istruzione ALTER DATABASE non riuscita.

La seguente query interrompe i processi che accedono al database:

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

Quindi dovresti essere in grado di riportare il database in modalità multiutente come al solito:

ALTER DATABASE 'DatabaseName' SET MULTI_USER

2
Questa è una soluzione molto ingombrante ed equivale a un gioco frustrante di schifo su una talpa su un sistema frenetico. Per eliminare tutti gli utenti, molto più facile da usare ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEcome mostra la risposta di Mike.
Aaron Bertrand

1
@AaronBertrand La soluzione di Mike non funzionerà se il database è già in modalità Utente singolo e si tenta di accedervi da un'altra connessione.
Maxim Paukov,

2
Giusto, se è così, dovrebbe trovare le sessioni come hai delineato. Tuttavia, se la connessione che ha impostato il database su single_user è la sua ...
Aaron Bertrand
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.