2012-04-30 34 views
29

Tôi muốn đóng kết nối hiện tại với Máy chủ MS SQL để tôi có thể thực hiện khôi phục trên cơ sở dữ liệu đó theo chương trình.Cách đóng các kết nối hiện có thành DB

+1

có thể trùng lặp: [? Làm thế nào để bạn giết tất cả các kết nối hiện tại với một SQL Server 2005 cơ sở dữ liệu] (http://stackoverflow.com/questions/11620/how-do-you-kill-all-current-connections-to-a-sql-server-2005-database) – zimdanen

Trả lời

47

này nên ngắt kết nối tất cả mọi người khác, và để lại cho bạn như là người dùng chỉ:

alter database YourDb set single_user with rollback immediate 

Lưu ý: Đừng quên

alter database YourDb set MULTI_USER 

sau khi bạn đã hoàn tất!

+13

Đừng quên 'ALTER DATABASE YourDb SET MULTI_USER' sau khi bạn đã hoàn tất! –

3

Tìm thấy nó ở đây: 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

cảm ơn nhưng truy vấn này mất hơn 2 phút để tôi chỉ hủy bỏ nó – Haz

+1

IMHO đây là một cách không cần thiết phức tạp và không hiệu quả để làm điều đó. @ Andomar của câu trả lời hoàn thành điều tương tự với nỗ lực ít hơn nhiều và kiểm soát lực lượng vũ phu tốt hơn trên các giao dịch trong chuyến bay. Nó cũng không nắm bắt những người dùng có một cơ sở dữ liệu khác nhau được báo cáo trong khung nhìn * deprecated * sysprocesses nhưng vẫn giữ các khóa trên cơ sở dữ liệu hiện tại. –

+3

Cảm ơn Aaron vì sự xấu hổ hàng tuần của tôi. Nó giết chết quá trình, nhưng chắc chắn không phải thanh lịch. – Vinnie

2

giải pháp hoàn hảo được cung cấp bởi 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

nó dài, nhưng cũng là giải pháp duy nhất làm việc cho tôi! thx – curiousBoy

13

trong khôi phục thuật sĩ nhấp chuột "gần kết nối hiện có cơ sở dữ liệu điểm đến"

trong Detach Database Wizard nhấp chuột "Thả kết nối" mục.

+0

Tùy chọn này không phải lúc nào cũng khả dụng – Squazz

1

Bạn có thể dùng con trỏ như thế:

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 

tôi đã viết về điều đó trong blog của tôi ở đây: http://www.pigeonsql.com/single-post/2016/12/13/Kill-all-connections-on-DB-by-Cursor

Các vấn đề liên quan