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?
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
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
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
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.
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
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
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.
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.
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'
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)
Voici comment faire pour fiable ce genre de chose dans MS SQL Server Management Studio 2008 (peut fonctionner pour d'autres versions aussi):
- 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é.
- 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.
- 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...
- fermez ce que vous pouvez.
- tuer tous les processus restants de l'onglet Processus.
- réactivez la base de données.
- renommer le DB.
- remettez votre service en ligne et pointez-le vers la nouvelle base de données.
l'option qui me convient dans ce scénario est la suivante:
- 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.
- désactivez les connexions actives, annulez l'opération de détachement.
- la base de données devrait maintenant être disponible pour la restauration.
essayez ceci:
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 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....
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.
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 .
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;
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.