Compartilhar via


sp_detach_db (Transact-SQL)

Aplica-se a: SQL Server

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

Para que um banco de dados replicado seja desanexado, é preciso que ele seja não publicado. Para obter mais informações, consulte a seção Comentários mais adiante neste artigo.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Argumentos

@dbname [ = ] N'dbname'

O nome do banco de dados a ser desanexado. @dbname é sysname, com um padrão de NULL.

@skipchecks [ = ] N'skipchecks'

Especifica se deve ignorar ou executar UPDATE STATISTICS. @skipchecks é nvarchar(10), com um padrão de NULL. Para pular UPDATE STATISTICS, especifique true. Para executar UPDATE STATISTICSexplicitamente o , especifique false.

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

@keepfulltextindexfile [ = ] N'keepfulltextindexfile'

Especifica que o arquivo de índice de texto completo associado ao banco de dados que está sendo desanexado não é descartado durante a operação de desanexação do banco de dados. @keepfulltextindexfile é 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, metadados relacionados ao texto completo são mantidos.

Importante

Esse recurso será removido em uma versão futura do SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.

Valores do código de retorno

0 (sucesso) ou 1 (falha).

Conjunto 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 qualquer conta de logon, master torna-se seu 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 login, consulte sp_helplogins. Se você tiver as permissões necessárias, poderá usar ALTER LOGIN para atribuir um novo banco de dados padrão a um logon.

Limitações

Um banco de dados não poderá ser desanexado se qualquer uma das seguintes condições for verdadeira:

  • O banco de dados está atualmente em uso. Para obter mais informações, consulte Obter acesso exclusivo.

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

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

    Se não for possível usar sp_replicationdboption, você poderá remover a duplicação com a execução de 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 Descartar um instantâneo de banco de dados.

    Não é possível desanexar ou anexar um instantâneo do banco de dados.

  • 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.

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

Obtenha acesso exclusivo

A desanexação de um banco de dados exige acesso exclusivo ao banco de dados. Se o banco de dados que você deseja desanexar estiver em uso, antes de desanexá-lo, defina o banco de dados como SINGLE_USER modo para obter acesso exclusivo.

Antes de definir o banco de dados como SINGLE_USER, verifique se a AUTO_UPDATE_STATISTICS_ASYNC opção está definida como OFF. Quando essa opção é definida como ON, o thread em segundo plano usado para atualizar estatísticas faz uma conexão com o banco de dados e você não consegue acessar o banco de dados no modo de usuário único. Veja mais informações em Definir um banco de dados como 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

Para forçar os usuários atuais a sair do banco de dados imediatamente ou dentro de um número especificado de segundos, você também pode usar a ROLLBACK opção.

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

Para saber mais, confira ALTERAR BANCO DE DADOS.

Reanexar um banco de dados

Os arquivos desanexados permanecem e podem ser reanexados usando CREATE DATABASE (com a FOR ATTACH opção 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

Os exemplos de código do Transact-SQL deste artigo usa o banco de dados de exemplo AdventureWorks2022 ou AdventureWorksDW2022, que pode ser baixado da home page Microsoft SQL Server Samples and Community Projects.

O exemplo a seguir desanexa o AdventureWorks2022 banco de dados com @skipchecks definido 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 de índice de texto completo. Esse comando executa UPDATE STATISTICS, que é o comportamento padrão.

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