Erreur lors du changement de nom de la base de données dans SQL Server 2008 R2

164

J'utilise cette requête pour renommer la base de données:

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

Mais cela montre une erreur lors de l'exécution:

Msg 5030, niveau 16, état 2, ligne 1
La base de données n'a pas pu être verrouillée exclusivement pour effectuer l'opération.

Y a-t-il un problème avec ma requête?

Vikram Bose
la source
4
Il n'y a rien de mal avec la requête - l'erreur vous indique que d'autres connexions sont connectées à la base de données, vous n'êtes donc pas autorisé à la renommer pour le moment.
Damien_The_Unbeliever
1
Si vous faites cela à partir de SSMS, assurez-vous qu'aucune fenêtre de requête n'est ouverte sur cette base de données, car il s'agit d'une connexion distincte qui place un verrou sur la base de données.
jleach

Réponses:

330

Vous pouvez essayer de définir la base de données en mode mono-utilisateur.

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
Calamar
la source
1
est WITH ROLLBACK IMMEDIATEnécessaire. Si je ne l'utilise pas du tout, cela posera-t-il des problèmes?
user13892
Un peu tard pour le parti, mais pour répondre à cette question: oui, vous devriez utiliser WITH ROLLBACK IMMEDIATElors de la modification d'une base de données sur laquelle d'autres utilisateurs pourraient opérer, afin de garantir l'intégrité de ces opérations. Mais ce n'est pas vraiment nécessaire pour remettre la base de données en mode MULTI_USER car la base de données est déjà en mode SINGLE_USER et vous êtes le seul utilisateur capable d'exécuter des transactions de toute façon.
Hakan Yildizhan
61
  1. Réglez la base de données en mode unique:

    ALTER DATABASE dbName
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  2. Essayez de renommer la base de données:

    ALTER DATABASE dbName MODIFY NAME = NewName
  3. Définissez la base de données en mode multi-utilisateur:

    ALTER DATABASE NewName
    SET MULTI_USER WITH ROLLBACK IMMEDIATE
Samiey Mehdi
la source
@SamieyMehdi Dois-je utiliser WITH ROLLBACk IMMEDIATEpour multi-utilisateur?
BendEg
29

Dans SQL Server Management Studio (SSMS) :

Vous pouvez également cliquer avec le bouton droit sur votre base de données dans l' Explorateur d'objets et accéder à Propriétés . De là, allez dans Options . Faites défiler vers le bas et définissez Restreindre l'accès à SINGLE_USER . Modifiez le nom de votre base de données, puis revenez et définissez-le sur MULTI_USER .

Justin Woodmancy
la source
Rapide et facile!
ani627
C'est parfait. Travailler avec SQL Server 2017
Adam Macierzyński
19

Essayez d'abord de fermer toutes les connexions à votre base de données:

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

Pris d' ici

Andrey Gordeev
la source
4

Cela l'a fait pour moi:

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
la source
2

Changer la base de données en mode mono-utilisateur comme indiqué dans les autres réponses

Parfois, même après la conversion en mode mono-utilisateur, la seule connexion autorisée à la base de données peut être en cours d'utilisation.

Pour fermer une connexion même après la conversion en mode mono-utilisateur, essayez:

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

Regardez les résultats et voyez l'ID de la connexion à la base de données en question.

Ensuite, utilisez la commande ci-dessous pour fermer cette connexion (il ne devrait y en avoir qu'une car la base de données est maintenant en mode mono-utilisateur)

KILL connection_ID

Remplacez connection_id par l'ID dans les résultats de la première requête

slayernoah
la source
1

1. base de données définie le premier mode utilisateur unique

ALTER DATABASE BOSEVIKRAM SET SINGLE_USER AVEC ROLLBACK IMMEDIATE

2. RENOMMER LA BASE DE DONNÉES

ALTER DATABASE BOSEVIKRAM MODIFY NAME = [BOSEVIKRAM_Deleted]

3.DATABAE SET MULIUSER MODE

ALTER DATABASE BOSEVIKRAM_Deleted SET MULTI_USER WITH ROLLBACK IMMEDIATE

K GANGA
la source
0

Une autre façon de fermer toutes les connexions:

Outils d'administration> Afficher les services locaux

Arrêter / démarrer le service "SQL Server (MSSQLSERVER)"

Chronozoaires
la source
-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
la source
C'est exactement la même réponse que Squid's
reggaeguitar