sp_detach_db (Transact-SQL)

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

Observação importanteImportante

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.

Ícone de vínculo de tópicoConvenções de sintaxe 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 de 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 no Mecanismo de Banco de Dados do SQL Server 2005 e nas versões posteriores. A execução de UPDATE STATISTICS é útil para bancos de dados que serão movidos para mídias somente leitura.

  • [ @keepfulltextindexfile= ] 'KeepFulltextIndexFile'
    Especifica se 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 índices de texto completo associados ao banco de dados e aos 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 relativos a texto completo serão mantidos.

    Observação importanteImportante

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

Valores de 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 era o banco de dados padrão de quaisquer contas de logon, o mestre se torna o banco de dados padrão delas.

ObservaçãoObservaçã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 exigidas, poderá usar ALTER LOGIN para atribuir um novo banco de dados padrão para 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 poder desanexar o banco de dados, é preciso desabilitar a publicação executando sp_replicationdboption.

    ObservaçãoObservaçã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 Como descartar um instantâneo do banco de dados (Transact-SQL).

    ObservaçãoObservaçã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, consulte Removendo o espelhamento de banco de dados.

  • O banco de dados é suspeito.

    No SQL Server 2005 e versões posteriores, é 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 em 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.

Por exemplo, a instrução ALTER DATABASE a seguir obtém acesso exclusivo para o banco de dados AdventureWorks2008R2 após todos os usuários atuais se desconectarem do banco de dados.

USE master;
ALTER DATABASE AdventureWorks2008R2
SET SINGLE_USER;
GO
ObservaçãoObservação

Para forçar os usuários atuais a saírem imediatamente do banco de dados ou após um número específico de segundos, você também pode usar a opção ROLLBACK: ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK rollback_option. Para obter mais informações, consulte 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 à função de servidor fixa sysadmin.

Exemplos

O exemplo a seguir desanexa o banco de dados AdventureWorks2008R2 com skipchecks definido como verdadeiro.

EXEC sp_detach_db 'AdventureWorks2008R2', 'true';

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

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