sp_detach_db (Transact-SQL)

Aplica-se a:SQL Server

Desanexa um banco de dados que não está em uso atualmente em uma instância de servidor e, opcionalmente, executa UPDATE STATISTICS em todas as tabelas antes de desanexar.

Importante

Para que um banco de dados replicado seja desanexado, é preciso que ele seja não publicado. Para obter mais informações, consulte "Comentários", posteriormente neste tópico.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Argumentos

[ @dbname = ] 'database_name' É o nome do banco de dados a ser desanexado. database_name é um valor sysname , com um valor padrão NULL.

[ @skipchecks = ] 'skipchecks' Especifica se é necessário ignorar ou executar UPDATE STATISTIC. skipchecks é um valor nvarchar(10), com um valor padrão de NULL. Para ignorar UPDATE STATISTICS, especifique true. Para executar explicitamente UPDATE STATISTICS, especifique false.

Por padrão, UPDATE STATISTICS é executado para atualizar as informações sobre os dados nas tabelas e os índices. A execução de UPDATE STATISTICS é útil para bancos de dados que serão movidos para mídias somente leitura.

[ @keepfulltextindexfile = ] 'KeepFulltextIndexFile' Especifica que o arquivo de índice de texto completo associado ao banco de dados que está sendo desanexado não será descartado durante a operação de desanexação do banco de dados. KeepFulltextIndexFile é um valor nvarchar(10) com um padrão de true. Se KeepFulltextIndexFile for false, todos os arquivos de índice de texto completo associados ao banco de dados e os metadados do índice de texto completo serão descartados, a menos que o banco de dados seja somente leitura. Se NULL ou true, os metadados relacionados ao texto completo serão mantidos.

Importante

O parâmetro @keepfulltextindexfile será removido em uma versão futura do SQL Server. Não use esse parâmetro em desenvolvimentos novos e modifique, assim que possível, os aplicativos que atualmente o usam.

Valores do código de retorno

0 (êxito) ou 1 (falha)

Conjuntos de resultados

Nenhum

Comentários

Quando um banco de dados é desanexado, todos os metadados são descartados. Se o banco de dados for o banco de dados padrão de qualquer conta de logon, master se tornará o banco de dados padrão.

Observação

Para obter informações sobre como exibir o banco de dados padrão de todas as contas de logon, consulte sp_helplogins (Transact-SQL). Se você tiver as permissões necessárias, poderá usar ALTER LOGIN para atribuir um novo banco de dados padrão a um logon.

Restrições

Um banco de dados não pode ser desanexado se algum dos seguintes fatores for verdadeiro:

  • O banco de dados está atualmente em uso. Para obter mais informações, consulte "Obtendo acesso exclusivo”, posteriormente neste tópico.

  • Se duplicado, o banco de dados será publicado.

    Antes de desanexar o banco de dados, você deve desabilitar a publicação executando sp_replicationdboption.

    Observação

    Se não for possível usar sp_replicationdboption, você poderá remover a replicação executando sp_removedbreplication.

  • Há um instantâneo do banco de dados no banco de dados.

    Antes de poder desanexar o banco de dados, você deve descartar todos os seus instantâneos. Para obter mais informações, consulte Remover um instantâneo de banco de dados (Transact-SQL).

    Observação

    Um instantâneo do banco de dados não pode ser desanexado ou anexado.

  • O banco de dados está sendo espelhado.

    O banco de dados não pode ser desanexado até que a sessão de espelhamento de banco de dados seja encerrada. Para obter mais informações, veja Removendo o espelhamento de banco de dados (SQL Server).

  • O banco de dados é suspeito.

    É preciso colocar um banco de dados suspeito em modo de emergência antes de poder desanexá-lo. Para obter mais informações sobre como colocar um banco de dados no modo de emergência, consulte ALTER DATABASE (Transact-SQL).

  • O banco de dados é um banco de dados de sistema.

Obtendo acesso exclusivo

A desanexação de um banco de dados exige acesso exclusivo ao banco de dados. Se o banco de dados a ser dexanexado estiver em uso, antes que ele possa ser desanexado, defina o banco de dados como modo SINGLE_USER para obter acesso exclusivo.

Antes de definir o banco de dados como SINGLE_USER, verifique se a opção AUTO_UPDATE_STATISTICS_ASYNC está definida como OFF. Quando esta opção está definida como ON, o thread em segundo plano usado para a atualização de estatísticas estabelece uma conexão com o banco de dados e não será possível acessar o banco de dados em modo de usuário único. Para obter mais informações, consulte definir um banco de dados para o modo de usuário único.

Por exemplo, a instrução a seguir ALTER DATABASE obtém acesso exclusivo ao banco de dados AdventureWorks2022 depois que todos os usuários atuais se desconectam do banco de dados.

USE master;  
ALTER DATABASE AdventureWorks2022  
SET SINGLE_USER;  
GO  

Observação

Para forçar os usuários atuais a sair do banco de dados imediatamente ou dentro de um número especificado de segundos, use também a opção ROLLBACK: ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK rollback_option. Para obter mais informações, veja ALTER DATABASE (Transact-SQL).

Reanexando um banco de dados

Os arquivos desanexados permanecem e podem ser anexados novamente com o uso de CREATE DATABASE (com a opção FOR ATTACH ou FOR ATTACH_REBUILD_LOG). Os arquivos podem ser movidos para outro servidor, onde podem ser anexados.

Permissões

Requer associação na função de servidor fixa sysadmin ou associação na função db_owner do banco de dados.

Exemplos

O exemplo a seguir desanexa o banco de dados AdventureWorks2022 com skipchecks definidos como true.

EXEC sp_detach_db 'AdventureWorks2022', 'true';  

O exemplo a seguir desanexa o banco de dados AdventureWorks2022 e mantém os arquivos de índice de texto completo e os metadados do índice de texto completo. Esse comando executa UPDATE STATISTICS, que é o comportamento padrão.

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

Consulte Também

ALTER DATABASE (Transact-SQL)
Anexar e desanexar bancos de dados (SQL Server)
CREATE DATABASE (SQL Server Transact-SQL)
Desanexar um banco de dados