2012-04-30 15 views
29

Desidero chiudere le connessioni esistenti a un MS SQL Server in modo che sia possibile eseguire un ripristino su tale database in modo programmatico.Come chiudere le connessioni esistenti a un DB

+1

Eventuali duplicati: [? Come si fa a uccidere tutti i collegamenti attuali per un database SQL Server 2005] (http://stackoverflow.com/questions/11620/how-do-you-kill-all-corrent-connections-to-a-sql-server-2005-database) – zimdanen

risposta

47

Questo dovrebbe staccare tutti gli altri, e vi lascio come l'unico utente:

alter database YourDb set single_user with rollback immediate 

Nota: Non dimenticare

alter database YourDb set MULTI_USER 

dopo aver finito!

+13

Non dimenticare "ALTER DATABASE YourDb SET MULTI_USER' dopo aver finito! –

3

trovato qui: 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

grazie, ma questa query ha richiesto più di 2 minuti l'ho appena cancellato – Haz

+1

IMHO questo è un modo inutilmente complesso e inefficace per farlo. @ La risposta di Andomar realizza la stessa cosa con molto meno sforzo e con un migliore controllo della forza bruta sulle transazioni in volo. Inoltre, non acquisisce gli utenti che hanno un database diverso segnalato nella vista * sysprocesses deprecata * ma mantengono ancora blocchi nel database corrente. –

+3

Grazie Aaron per il mio shaming settimanale. Uccide il processo, ma certamente non elegantemente. – Vinnie

2

Soluzione perfetta fornita da 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

è piuttosto lungo, ma anche l'unica soluzione ha funzionato per me! grazie – curiousBoy

13

in Restore Wizard click "stretti legami esistenti al database di destinazione"

in Disconnetti Database guidata click "goccia di connessione" articolo.

+0

Questa opzione non è sempre disponibile – Squazz

1

È possibile utilizzare il cursore del genere:

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 

ho scritto che nel mio blog qui: http://www.pigeonsql.com/single-post/2016/12/13/Kill-all-connections-on-DB-by-Cursor

Problemi correlati