sp_detach_db (Transact-SQL)

Si applica a:SQL Server

Scollega un database attualmente non in uso da un'istanza del server e, facoltativamente, esegue UPDATE STATISTICS su tutte le tabelle prima dello scollegamento.

Importante

Per poter scollegare un database replicato, è necessario che non sia pubblicato. Per ulteriori informazioni, vedere la sezione "Osservazioni" di seguito in questo argomento.

Convenzioni di sintassi Transact-SQL

Sintassi

  
sp_detach_db [ @dbname= ] 'database_name'   
    [ , [ @skipchecks= ] 'skipchecks' ]   
    [ , [ @keepfulltextindexfile = ] 'KeepFulltextIndexFile' ]   

Argomenti

[ @dbname = ] 'database_name' Nome del database da scollegare. database_name è un valore sysname, con un valore predefinito NULL.

[ @skipchecks = ] 'skipchecks' Specifica se ignorare o eseguire UPDATE STATISTIC. skipchecks è un valore nvarchar(10), con un valore predefinito NULL. Per ignorare UPDATE STATISTICS, specificare true. Per eseguire in modo esplicito UPDATE STATISTICS, specificare false.

Per impostazione predefinita, l'istruzione UPDATE STATISTICS viene eseguita per aggiornare le informazioni sui dati nelle tabelle e negli indici. L'esecuzione di UPDATE STATISTICS risulta utile per i database che devono essere spostati su supporti di sola lettura.

[ @keepfulltextindexfile = ] 'KeepFulltextIndexFile' Specifica che il file di indice full-text associato al database scollegato non verrà eliminato durante l'operazione di scollegamento del database. KeepFulltextIndexFile è un valore nvarchar(10) con valore predefinito true. Se KeepFulltextIndexFile è false, tutti i file di indice full-text associati al database e i metadati dell'indice full-text vengono eliminati, a meno che il database non sia di sola lettura. Se NULL o true, i metadati correlati a full-text vengono mantenuti.

Importante

Il parametro @keepfulltextindexfile verrà rimosso in una versione futura di SQL Server. Non utilizzare questo parametro in un nuovo progetto di sviluppo e modificare non appena possibile le applicazioni in cui viene attualmente utilizzato.

Valori del codice restituito

0 (operazione completata) o 1 (operazione non riuscita)

Set di risultati

Nessuno

Osservazioni:

Quando un database è scollegato, tutti i suoi metadati vengono eliminati. Se il database è il database predefinito di qualsiasi account di accesso, master diventa il database predefinito.

Nota

Per informazioni su come visualizzare il database predefinito di tutti gli account di accesso, vedere sp_helplogins (Transact-SQL). Se si dispone delle autorizzazioni necessarie, è possibile usare ALTER LOGIN per assegnare un nuovo database predefinito a un account di accesso.

Limitazioni

Non è possibile scollegare un database se una delle seguenti condizioni è vera:

  • Il database è attualmente in uso. Per ulteriori informazioni, vedere la sezione "Come ottenere l'accesso esclusivo" di seguito in questo argomento.

  • Se è replicato, il database viene pubblicato.

    Prima di poter scollegare il database, è necessario disabilitare la pubblicazione eseguendo sp_replicationdboption.

    Nota

    Se non è possibile usare sp_replicationdboption, rimuovere la replica eseguendo sp_removedbreplication.

  • Uno snapshot del database esiste nel database.

    Prima di scollegare il database, è necessari eliminare tutti i relativi snapshot. Per altre informazioni, vedere Eliminare uno snapshot del database (Transact-SQL).

    Nota

    Non è possibile scollegare o collegare uno snapshot del database.

  • È in corso il mirroring del database.

    Non è possibile scollegare il database finché non viene terminata la sessione di mirroring del database. Per altre informazioni, vedere Rimozione del mirroring del database (SQL Server).

  • Il database è sospetto.

    Per scollegare un database sospetto è prima necessario attivare la modalità di emergenza. Per altre informazioni su come inserire un database in modalità di emergenza, vedere ALTER DATABASE (Transact-SQL).

  • Il database è un database di sistema.

Come ottenere l'accesso esclusivo

Per scollegare un database, è necessario l'accesso esclusivo al database. Se il database che si desidera scollegare è in uso, per scollegarlo è necessario impostare la modalità SINGLE_USER, in modo da ottenere l'accesso esclusivo.

Prima di impostare il database in modalità SINGLE_USER, verificare che l'opzione AUTO_UPDATE_STATISTICS_ASYNC sia impostata su OFF. Se l'opzione è impostata su ON, tramite il thread in background utilizzato per aggiornare le statistiche viene stabilita una connessione con il database che non sarà quindi accessibile in modalità utente singolo. Per altre informazioni, vedere Impostare un database sulla modalità utente singolo.

Ad esempio, l'istruzione seguente ALTER DATABASE ottiene l'accesso esclusivo al database AdventureWorks2022 dopo che tutti gli utenti correnti si disconnettono dal database.

USE master;  
ALTER DATABASE AdventureWorks2022  
SET SINGLE_USER;  
GO  

Nota

Per forzare immediatamente gli utenti correnti dal database o entro un numero specificato di secondi, usare anche l'opzione ROLLBACK: ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK rollback_option. Per altre informazioni, vedere ALTER DATABASE (Transact-SQL).

Ricollegamento di un database

I file scollegati non vengono eliminati e possono essere ricollegati tramite CREATE DATABASE (con l'opzione FOR ATTACH o FOR ATTACH_REBUILD_LOG). È possibile spostare e quindi collegare tali file in un altro server.

Autorizzazioni

Richiede l'appartenenza al ruolo predefinito del server sysadmin o all'appartenenza al ruolo db_owner del database.

Esempi

Nell'esempio seguente il database AdventureWorks2022 viene scollegato con skipchecks impostato su true.

EXEC sp_detach_db 'AdventureWorks2022', 'true';  

L'esempio seguente scollega il database AdventureWorks2022 e mantiene i file di indice full-text e i metadati dell'indice full-text. Per impostazione predefinita, questo comando esegue UPDATE STATISTICS.

exec sp_detach_db @dbname='AdventureWorks2022'  
    , @keepfulltextindexfile='true';  

Vedi anche

ALTER DATABASE (Transact-SQL)
Scollegamento e collegamento del database (SQL Server)
CREATE DATABASE (SQL Server Transact-SQL)
Scollegamento di un database