Erro ao renomear o banco de dados no SQL Server 2008 R2

164

Estou usando esta consulta para renomear o banco de dados:

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

Mas mostra um erro ao executar:

Msg 5030, Nível 16, Estado 2, Linha 1
O banco de dados não pôde ser bloqueado exclusivamente para executar a operação.

Há algo de errado com minha consulta?

Vikram Bose
fonte
4
Não há nada errado com a consulta - o erro está informando que outras conexões estão conectadas ao banco de dados; portanto, você não pode renomeá-lo no momento.
Damien_The_Unbeliever
1
Se você estiver fazendo isso no SSMS, verifique se não há uma janela de consulta aberta nesse banco de dados, pois é uma conexão separada que coloca um bloqueio no banco de dados.
Jleach # 19/16

Respostas:

329

Você pode tentar configurar o banco de dados no modo de usuário único.

https://stackoverflow.com/a/11624/2408095

use master
ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE    
ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]
ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER
Lula
fonte
1
é WITH ROLLBACK IMMEDIATEnecessário. Se eu não usá-lo, isso causará problemas?
user13892
Um pouco atrasado para a parte, mas para responder a esta pergunta: sim, você deve usar WITH ROLLBACK IMMEDIATEao alterar um banco de dados em que outros usuários possam estar operando, a fim de garantir a integridade dessas operações. Mas não é realmente necessário quando o banco de dados é retornado ao modo MULTI_USER novamente, pois o banco de dados já está no modo SINGLE_USER e você é o único usuário capaz de executar qualquer transação.
Hakan Yildizhan
61
  1. Defina o banco de dados para o modo único:

    ALTER DATABASE dbName
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    
  2. Tente renomear o banco de dados:

    ALTER DATABASE dbName MODIFY NAME = NewName
  3. Defina o banco de dados para o modo multiusuário:

    ALTER DATABASE NewName
    SET MULTI_USER WITH ROLLBACK IMMEDIATE
    
Samiey Mehdi
fonte
@SamieyMehdi Devo usar WITH ROLLBACk IMMEDIATEpara multiusuário?
BendEg
29

No SQL Server Management Studio (SSMS) :

Você também pode clicar com o botão direito do mouse no banco de dados no Pesquisador de Objetos e ir para Propriedades . A partir daí, vá para Opções . Role todo o caminho e defina Restringir acesso como SINGLE_USER . Altere o nome do seu banco de dados, volte e configure-o novamente para MULTI_USER .

Justin Woodmancy
fonte
Rápido e fácil!
Ani627 17/03/19
Perfeito. Trabalhando com SQL Server 2017
Adam Macierzyński
19

Tente fechar todas as conexões com seu banco de dados primeiro:

use master
ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER

Retirado daqui

Andrey Gordeev
fonte
4

Isso fez por mim:

USE [master];
GO
ALTER DATABASE [OldDataBaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
EXEC sp_renamedb N'OldDataBaseName', N'NewDataBaseName';


-- Add users again
ALTER DATABASE [NewDataBaseName] SET MULTI_USER
GO
t_plusplus
fonte
2

Altere o banco de dados para o modo de usuário único, conforme mostrado nas outras respostas

Às vezes, mesmo após a conversão para o modo de usuário único, a única conexão permitida ao banco de dados pode estar em uso.

Para fechar uma conexão mesmo após a conversão para o modo de usuário único, tente:

select * from master.sys.sysprocesses
where spid>50 -- don't want system sessions
  and dbid = DB_ID('BOSEVIKRAM')

Veja os resultados e veja o ID da conexão com o banco de dados em questão.

Em seguida, use o comando abaixo para fechar esta conexão (deve haver apenas um, pois o banco de dados agora está no modo de usuário único)

KILL connection_ID

Substitua connection_id pelo ID nos resultados da 1ª consulta

slayernoah
fonte
1

1. banco de dados definido 1º modo de usuário único

ALTER DATABASE BOSEVIKRAM SET SINGLE_USER COM ROLLBACK IMEDIATO

2. Renomeie a base de dados

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

3. DATABAE AJUSTE O MODO MULTIUSER

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER COM ROLLBACK IMEDIATO

K GANGA
fonte
0

Outra maneira de fechar todas as conexões:

Ferramentas administrativas> Exibir serviços locais

Parar / Iniciar o serviço "SQL Server (MSSQLSERVER)"

Chronozoa
fonte
-1
use master

ALTER DATABASE BOSEVIKRAM SET SINGLE_USER WITH ROLLBACK IMMEDIATE  

exec sp_renamedb 'BOSEVIKRAM','BOSEVIKRAM_Deleted'

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER
KamalDeep
fonte
Esta é a mesma resposta que o Squid's
Reggaeguitar