2012-04-30 27 views
29

Quiero cerrar las conexiones existentes a un servidor MS SQL para que pueda hacer una restauración en esa base de datos programáticamente.Cómo cerrar las conexiones existentes a un DB

+1

duplicado posible: [? ¿Cómo se puede matar a todas las conexiones actuales a una base de datos de SQL Server 2005] (http://stackoverflow.com/questions/11620/how-do-you-kill-all-current-connections-to-a-sql-server-2005-database) – zimdanen

Respuesta

47

Esto debe desconectar todos los demás, y dejar que el único usuario:

alter database YourDb set single_user with rollback immediate 

Nota: No se olvide

alter database YourDb set MULTI_USER 

después de que haya terminado!

+13

¡No olvide 'ALTER DATABASE YourDb SET MULTI_USER' después de que haya terminado! –

3

encontrado aquí: http://awesomesql.wordpress.com/2010/02/08/script-to-drop-all-connections-to-a-database/

DECLARE @dbname NVARCHAR(128) 
SET @dbname = 'DB name here' 
-- db to drop connections 
DECLARE @processid INT 
SELECT @processid = MIN(spid) 
FROM master.dbo.sysprocesses 
WHERE dbid = DB_ID(@dbname) 
WHILE @processid IS NOT NULL 
    BEGIN 
     EXEC ('KILL ' + @processid) 
     SELECT @processid = MIN(spid) 
     FROM master.dbo.sysprocesses 
     WHERE dbid = DB_ID(@dbname) 
    END 
+0

gracias, pero esta consulta tomó más de 2 minutos, por lo Acabo de cancelarlo – Haz

+1

En mi humilde opinión, esta es una forma innecesariamente compleja e ineficaz de hacerlo. La respuesta de @Andomar logra lo mismo con mucho menos esfuerzo y con un mejor control de la fuerza bruta sobre las transacciones en vuelo. Tampoco captura usuarios que tienen una base de datos diferente informada en la vista de * sproprocesses * obsoleta, pero aún mantienen bloqueos en la base de datos actual. –

+3

Gracias, Aaron por mi vergüenza semanal. Mata el proceso, pero ciertamente no elegantemente. – Vinnie

2

La solución perfecta proporcionada por Stev.org: http://www.stev.org/post/2011/03/01/MS-SQL-Kill-connections-by-host.aspx

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[KillConnectionsHost]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[KillConnectionsHost] 
GO 


/****** Object: StoredProcedure [dbo].[KillConnectionsHost] Script Date: 10/26/2012 13:59:39 ******/ 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[KillConnectionsHost] @hostname varchar(MAX) 
AS 
    DECLARE @spid int 
    DECLARE @sql varchar(MAX) 

    DECLARE cur CURSOR FOR 
     SELECT spid FROM sys.sysprocesses P 
      JOIN sys.sysdatabases D ON (D.dbid = P.dbid) 
      JOIN sys.sysusers U ON (P.uid = U.uid) 
      WHERE hostname = @hostname AND hostname != '' 
      AND P.spid != @@SPID 

    OPEN cur 

    FETCH NEXT FROM cur 
     INTO @spid 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     PRINT CONVERT(varchar, @spid) 

     SET @sql = 'KILL ' + RTRIM(@spid) 
     PRINT @sql 
     EXEC(@sql) 

     FETCH NEXT FROM cur 
      INTO @spid 
    END 

    CLOSE cur 
    DEALLOCATE cur 
GO 
+0

es bastante largo, pero ¡también la única solución funcionó para mí! thx – curiousBoy

13

en Asistente de restauración clic en "Cerrar las conexiones existentes a la base de datos de destino"

en Separar base de datos asistente clic "terminar la conexión" ít.

+0

Esta opción no siempre está disponible – Squazz

1

Puede usar el cursor de esa manera:

USE master 
GO 

DECLARE @SQL AS VARCHAR(255) 
DECLARE @SPID AS SMALLINT 
DECLARE @Database AS VARCHAR(500) 
SET @Database = 'AdventureWorks2016CTP3' 

DECLARE Murderer CURSOR FOR 
SELECT spid FROM sys.sysprocesses WHERE DB_NAME(dbid) = @Database 

OPEN Murderer 

FETCH NEXT FROM Murderer INTO @SPID 
WHILE @@FETCH_STATUS = 0 

    BEGIN 
    SET @SQL = 'Kill ' + CAST(@SPID AS VARCHAR(10)) + ';' 
    EXEC (@SQL) 
    PRINT ' Process ' + CAST(@SPID AS VARCHAR(10)) +' has been killed' 
    FETCH NEXT FROM Murderer INTO @SPID 
    END 

CLOSE Murderer 
DEALLOCATE Murderer 

escribí sobre esto en mi blog aquí: http://www.pigeonsql.com/single-post/2016/12/13/Kill-all-connections-on-DB-by-Cursor

Cuestiones relacionadas