sp_detach_db (Transact-SQL)
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 STATISTICS
explicitamente 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
outrue
, 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';