Condividi tramite


sp_detach_db (Transact-SQL)

Si applica a: SQL Server

Scollega un database attualmente non in uso da un'istanza del server e, facoltativamente, viene eseguito UPDATE STATISTICS in tutte le tabelle prima di scollegare.

Per poter scollegare un database replicato, è necessario che non sia pubblicato. Per altre informazioni, vedere la sezione Osservazioni più avanti in questo articolo.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

sp_detach_db
    [ [ @dbname = ] N'dbname' ]
    [ , [ @skipchecks = ] N'skipchecks' ]
    [ , [ @keepfulltextindexfile = ] N'keepfulltextindexfile' ]
[ ; ]

Argomenti

[ @dbname = ] N'dbname'

Nome del database da scollegare. @dbname è sysname, con un valore predefinito .NULL

[ @skipchecks = ] N'skipchecks'

Specifica se ignorare o eseguire UPDATE STATISTICS. @skipchecks è nvarchar(10), con il valore predefinito NULL. Per ignorare UPDATE STATISTICS, specificare true. Per eseguire UPDATE STATISTICSin modo esplicito , specificare false.

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

[ @keepfulltextindexfile = ] N'keepfulltextindexfile'

Specifica che il file di indice full-text associato al database da scollegare non viene eliminato durante l'operazione di scollegamento del database. @keepfulltextindexfile è nvarchar(10), con il valore predefinito true.

  • Se @keepfulltextindexfile è false, vengono eliminati tutti i file di indice full-text associati al database e i metadati dell'indice full-text, a meno che il database non sia di sola lettura.
  • Se NULL o true, i metadati correlati a full-text vengono mantenuti.

Importante

Questa funzionalità verrà rimossa nelle versioni future di SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.

Valori del codice restituito

0 (esito positivo) o 1 (errore).

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. Se si hanno le autorizzazioni necessarie, è possibile usare ALTER LOGIN per assegnare un nuovo database predefinito a un account di accesso.

Limiti

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

  • Il database è attualmente in uso. Per altre informazioni, vedere Ottenere l'accesso esclusivo.

  • Se è replicato, il database viene pubblicato.

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

    Se non è possibile usare sp_replicationdboption, è possibile 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.

    Non è possibile scollegare o collegare uno snapshot del database.

  • È in corso il mirroring del database.

    Il database non può essere scollegato finché la sessione di mirroring del database non viene terminata. 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 impostare un database in modalità di emergenza, vedere ALTER DATABASE.

  • Il database è un database di sistema.

Ottenere l'accesso esclusivo

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

Prima di impostare il database su SINGLE_USER, verificare che l'opzione AUTO_UPDATE_STATISTICS_ASYNC sia impostata su OFF. Quando questa opzione è impostata su ON, il thread in background usato per aggiornare le statistiche accetta una connessione al database e non è possibile accedere al database in modalità utente singolo. Per ulteriori informazioni, vedere Impostare un database in 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

Per forzare immediatamente gli utenti correnti dal database o entro un numero specificato di secondi, è anche possibile usare l'opzione ROLLBACK .

ALTER DATABASE <database_name>
SET SINGLE_USER
WITH ROLLBACK <rollback_option>;

Per altre informazioni, vedere ALTER DATABASE.

Ricollegare un database

I file scollegati rimangono e possono essere ricollegati usando 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

Gli esempi di codice Transact-SQL in questo articolo usano il AdventureWorks2022 database di esempio o AdventureWorksDW2022 , che è possibile scaricare dalla home page degli esempi di Microsoft SQL Server e dei progetti della community.

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

EXEC sp_detach_db 'AdventureWorks2022', 'true';

Nell'esempio seguente viene scollegato il database AdventureWorks2022 e vengono mantenuti 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';