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 STATISTICS
in 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
otrue
, 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
, 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 utilizzano il database campione AdventureWorks2022
o AdventureWorksDW2022
, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.
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';