Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se: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
NULLoutrue, 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 seguinte ALTER DATABASE declaração obtém acesso exclusivo ao banco de dados AdventureWorks2025 após todos os usuários atuais se desconectarem 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 neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.
O exemplo a seguir desanexa o AdventureWorks2025 banco de dados com @skipchecks definido como true.
EXECUTE sp_detach_db 'AdventureWorks2022', 'true';
O exemplo a seguir desanexa o banco de dados AdventureWorks2025 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.
EXECUTE sp_detach_db
@dbname = 'AdventureWorks2022',
@keepfulltextindexfile = 'true';