Comment désactiver toutes les connexions courantes à une base de données SQL Server 2005?

je veux renommer une base de données, mais continuer à obtenir l'erreur que "ne pouvait pas obtenir de verrouillage exclusif" sur la base de données, ce qui implique qu'il ya une connexion(s) encore active.

Comment puis-je désactiver toutes les connexions à la base de données pour pouvoir la renommer?

280
demandé sur Tom H 2008-08-14 23:54:25

19 réponses

Voir Mettre Fin À Toutes Les Connexions À Une Base De Données .

la raison pour laquelle L'approche que Adam a suggéré ne fonctionnera pas est que pendant le temps que vous êtes en boucle sur les connexions actives nouvelles peut être établie, et vous allez manquer ceux. L'article I lié à l'utilisation de l'approche suivante qui n'a 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
371
répondu SQLMenace 2017-05-23 12:02:45

pour ce faire, remplacer "DB_NAME" par la base de données pour tuer 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
109
répondu Adam 2008-08-14 19:57:15

Tuer, et tuer avec 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
53
répondu btk 2010-05-12 10:40:36

utilisant SQL Management Studio Express:

dans L'arborescence de L'Explorateur D'objets, passez à" Activity Monitor "(si vous ne pouvez pas le trouver, cliquez avec le bouton droit de la souris sur le serveur de la base de données et sélectionnez"Activity Monitor"). En ouvrant le moniteur D'activité, vous pouvez voir toutes les informations sur le processus. Vous devriez être en mesure de trouver les serrures pour la base de données que vous êtes intéressé et tuer ces serrures, qui va également tuer la connexion.

vous devriez pouvoir pour renommer par la suite.

27
répondu Joseph Daigle 2011-11-21 07:51:13

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 
24
répondu brendan 2008-08-14 20:00:23
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE
21
répondu santhosh kumar 2012-07-18 09:25:31

décollage hors ligne prend un certain temps et parfois j'ai des problèmes avec cela..

la Plupart de manière solide à mon avis:

Détacher Clic droit DB - > tâches - > détacher... vérifier " branchements de largage" Ok

Rattacher Clic droit sur les bases de données -> joindre.. Ajouter... - >sélectionnez votre base de données, et changez la colonne Attach As au nom de votre base de données désirée. Ok

13
répondu NJV 2011-01-05 14:49:27
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 'master' et lancez cette requête, elle va tuer toutes les connexions actives de votre base de données.

6
répondu Talha 2012-02-01 10:11:50

j'ai l'habitude de tomber dans cette erreur quand j'essaie de restaurer une base de données, je vais juste en haut de L'arbre dans Management Studio et cliquez avec le bouton droit de la souris et redémarrez le serveur de base de données (parce que c'est sur une machine de développement, ce n'est peut-être pas idéal en production). C'est fermer toutes les connexions de base de données.

5
répondu RedWolves 2008-08-15 15:52:24

dans MS SQL Server Management Studio sur l'Explorateur d'objets, clic droit sur la base de données. Dans le menu contextuel qui suit, sélectionnez "Tâches -> déconnecter'

4
répondu John Christensen 2008-08-14 19:56:56

une autre approche "kill it with fire" consiste à redémarrer le service MSSQLSERVER. J'aime faire des trucs en ligne de commande. Coller ceci exactement dans CMD le fera: NET STOP MSSQLSERVER & NET START MSSQLSERVER

Ou d'ouvrir "des services.msc "et find" SQL Server (MSSQLSERVER)" et clic droit, sélectionnez "restart".

cela va "pour sûr, pour sûr" tuer toutes les connexions à toutes les bases de données qui tournent sur cette instance.

(I comme cela mieux que de nombreuses approches que le changement et le changement de la configuration sur le serveur/base de données)

4
répondu aikeru 2011-08-18 22:16:24

Voici comment faire pour fiable ce genre de chose dans MS SQL Server Management Studio 2008 (peut fonctionner pour d'autres versions aussi):

  1. dans L'arborescence de L'Explorateur D'objets, faites un clic 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 que vous voulez.
  3. clic droit sur le DB dans L'objet Explorer et lancer une tâche "tâches -> décollage". Laissez ce cours d'exécution en arrière-plan pendant que vous...
  4. fermez ce que vous pouvez.
  5. tuer tous les processus restants de l'onglet Processus.
  6. réactivez la base de données.
  7. renommer le DB.
  8. remettez votre service en ligne et pointez-le vers la nouvelle base de données.
4
répondu alirobe 2016-03-10 13:14:19

l'option qui me convient dans ce scénario est la suivante:

  1. lancer l'opération" Detach " sur la base de données en question. Ceci ouvrira une fenêtre (en SQL 2005) montrant les connexions actives qui empêchent les actions sur le DB.
  2. désactivez les connexions actives, annulez l'opération de détachement.
  3. la base de données devrait maintenant être disponible pour la restauration.
3
répondu Lars Timenes 2011-12-28 10:42:47

essayez ceci:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
2
répondu Joseph Sturtevant 2008-08-14 19:58:13

faites un clic droit sur le nom de la base de données, cliquez sur la propriété pour obtenir la fenêtre de propriété, ouvrez l'onglet Options et changez la propriété" restreindre L'accès " d'un utilisateur à L'autre. Lorsque vous appuyez sur le bouton OK, il vous invite à fermer toute connexion ouverte, sélectionnez "Oui" et vous êtes paramétré pour renommer la base de données....

2
répondu Sanjay Saxena 2010-11-15 11:13:29

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

2
répondu The Coder 2012-05-01 03:10:41

j'utilise SQL Server 2008 R2, ma base de données était déjà configurée pour un seul utilisateur et il y avait une connexion qui limitait toute action sur la base de données. Ainsi, la solution recommandée Sqlmenace's a répondu par erreur. Voici un qui a fonctionné dans mon cas .

2
répondu Ilmar 2017-05-23 12:26:27

j'utilise sp_who pour obtenir la liste de tous les processus dans la base de données. C'est mieux parce que vous voudrez peut-être examiner 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 tuer le processus que vous voulez.

SPID    KillCommand
26      kill 26;
27      kill 27;
28      kill 28;
0
répondu Rawitas Krungkaew 2015-05-07 09:42:40

vous pouvez utiliser la commande SP_Who et tuer tous les processus qui utilisent votre base de données et ensuite renommer votre base de données.

-1
répondu mehdi lotfi 2014-06-02 09:58:11