Comment supprimer toutes les connexions actuelles à une base de données SQL Server 2005 ?

StackOverflow https://stackoverflow.com/questions/11620

  •  08-06-2019
  •  | 
  •  

Question

Je souhaite renommer une base de données, mais j'obtiens toujours l'erreur "Impossible d'obtenir un verrouillage exclusif" sur la base de données, ce qui implique qu'une ou plusieurs connexions sont toujours actives.

Comment puis-je supprimer toutes les connexions à la base de données afin de pouvoir la renommer ?

Était-ce utile?

La solution

Voir Supprimez toutes les connexions actives à une base de données.

La raison pour laquelle l'approche qui Adam a suggéré ne fonctionnera pas, c'est que pendant le temps que vous parcourez les connexions actives, de nouvelles peuvent être établies, et vous les manquerez.L'article auquel j'ai lié utilise l'approche suivante qui ne présente pas cet inconvénient :

-- set your current connection to use master otherwise you might get an error

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER

Autres conseils

Script pour ce faire, remplacez « DB_NAME » par la base de données pour supprimer toutes les connexions à :

USE master
GO

SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''

Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)

IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END

Tuez-le et tuez-le par le feu :

USE master
go

DECLARE @dbname sysname
SET @dbname = 'yourdbname'

DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END

Utilisation de SQL Management Studio Express :

Dans l'arborescence de l'Explorateur d'objets, explorez sous Gestion jusqu'à "Moniteur d'activité" (si vous ne le trouvez pas, cliquez avec le bouton droit sur le serveur de base de données et sélectionnez "Moniteur d'activité").En ouvrant le moniteur d'activité, vous pouvez afficher toutes les informations sur le processus.Vous devriez pouvoir trouver les verrous de la base de données qui vous intéresse et supprimer ces verrous, ce qui tuera également la connexion.

Vous devriez pouvoir renommer après cela.

J'ai toujours utilisé :


ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go 
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user 
GO 
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE

La mise hors ligne prend un certain temps et parfois j'éprouve des problèmes avec cela.

La méthode la plus solide à mon avis :

DétacherFaites un clic droit sur DB -> Tâches -> Détacher...Vérifiez "Drop Connections" OK

RattacherFaites un clic droit sur Bases de données -> Attacher.Ajouter...-> sélectionnez votre base de données et modifiez la colonne Attacher sous le nom de la base de données souhaitée.D'accord

Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'

Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((                              
            select '  ' + KillCommand from #temp
            FOR XML PATH('')),1,1,'') 
Execute sp_executesql @query 
Drop table #temp

utilisez la base de données « maître » et exécutez cette requête, cela tuera toutes les connexions actives de votre base de données.

Je rencontre généralement cette erreur lorsque j'essaie de restaurer une base de données. Je vais généralement en haut de l'arborescence dans Management Studio, je fais un clic droit et je redémarre le serveur de base de données (car il se trouve sur une machine de développement, cela n'est peut-être pas idéal en production. ).Cela ferme toutes les connexions à la base de données.

Dans MS SQL Server Management Studio sur l'explorateur d'objets, faites un clic droit sur la base de données.Dans le menu contextuel qui suit, sélectionnez 'Tâches -> Mettre hors ligne'

Une autre approche « tuez-le par le feu » consiste simplement à redémarrer le service MSSQLSERVER.J'aime faire des choses à partir de la ligne de commande.Coller ceci exactement dans CMD le fera :NET STOP MSSQLSERVER & NET DÉMARRER MSSQLSERVER

Ou ouvrez « services.msc » et recherchez « SQL Server (MSSQLSERVER) » et faites un clic droit, sélectionnez « redémarrer ».

Cela tuera "à coup sûr, à coup sûr" TOUTES les connexions à TOUTES les bases de données exécutées sur cette instance.

(J'aime cela mieux que de nombreuses approches qui modifient et modifient la configuration sur le serveur/la base de données)

Voici comment effectuer ce genre de chose de manière fiable dans MS SQL Server Management Studio 2008 (peut également fonctionner pour d'autres versions) :

  1. Dans l'arborescence de l'explorateur d'objets, cliquez avec le bouton droit sur le serveur de base de données racine (avec la flèche verte), puis cliquez sur moniteur d'activité.
  2. Ouvrez l'onglet Processus dans le moniteur d'activité, sélectionnez le menu déroulant « Bases de données » et filtrez par la base de données souhaitée.
  3. Cliquez avec le bouton droit sur la base de données dans l'Explorateur d'objets et démarrez une tâche « Tâches -> Mise hors ligne ».Laissez-le fonctionner en arrière-plan pendant que vous...
  4. Arrêtez en toute sécurité tout ce que vous pouvez.
  5. Tuez tous les processus restants à partir de l’onglet Processus.
  6. Remettez la base de données en ligne.
  7. Renommez la base de données.
  8. Remettez votre service en ligne et pointez-le vers la nouvelle base de données.

L'option qui fonctionne pour moi dans ce scénario est la suivante :

  1. Démarrez l'opération "Détacher" sur la base de données concernée.Cela ouvrira une fenêtre (dans SQL 2005) affichant les connexions actives qui empêchent les actions sur la base de données.
  2. Tuez les connexions actives, annulez l'opération de détachement.
  3. La base de données devrait maintenant être disponible pour la restauration.

Essaye ça:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

Faites un clic droit sur le nom de la base de données, cliquez sur Propriété pour obtenir la fenêtre des propriétés, ouvrez l'onglet Options et modifiez la propriété "Restreindre l'accès" de Multi-utilisateur à Utilisateur unique.Lorsque vous appuyez sur le bouton OK, il vous sera demandé de fermer toutes les connexions ouvertes, de sélectionner "Oui" et vous êtes prêt à renommer la base de données....

Cela n'a pas fonctionné pour moi (SQL2008 Enterprise), je ne pouvais pas non plus voir de processus en cours d'exécution ou d'utilisateurs connectés à la base de données.Le redémarrage du serveur (clic droit sur Sql Server dans Management Studio et choisissez Redémarrer) m'a permis de restaurer la base de données.

J'utilise SQL Server 2008 R2, ma base de données était déjà définie pour un seul utilisateur et il existait une connexion qui limitait toute action sur la base de données.Ainsi le recommandé SQLMenace la solution a répondu avec une erreur. En voici un qui a fonctionné dans mon cas.

J'utilise sp_who pour obtenir la liste de tous les processus dans la base de données.C'est mieux car vous souhaiterez peut-être revoir quel processus tuer.

declare @proc table(
    SPID bigint,
    Status nvarchar(255),
    Login nvarchar(255),
    HostName nvarchar(255),
    BlkBy nvarchar(255),
    DBName nvarchar(255),
    Command nvarchar(MAX),
    CPUTime bigint,
    DiskIO bigint,
    LastBatch nvarchar(255),
    ProgramName nvarchar(255),
    SPID2 bigint,
    REQUESTID bigint
)

insert into @proc
exec sp_who2

select  *, KillCommand = concat('kill ', SPID, ';')
from    @proc

Résultat
Vous pouvez utiliser la commande dans la colonne KillCommand pour arrêter le processus souhaité.

SPID    KillCommand
26      kill 26;
27      kill 27;
28      kill 28;

Vous pouvez utiliser la commande SP_Who et supprimer tous les processus qui utilisent votre base de données, puis renommer votre base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top