【问题标题】:How to close existing connections to a DB如何关闭与数据库的现有连接
【发布时间】:2012-04-30 17:39:35
【问题描述】:

我想关闭与 MS SQL Server 的现有连接,以便我可以通过编程方式对该数据库进行恢复。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

这应该会断开其他所有人的连接,并让您成为唯一的用户:

alter database YourDb set single_user with rollback immediate

注意:不要忘记

alter database YourDb set MULTI_USER

完成后!

【讨论】:

  • 完成后不要忘记ALTER DATABASE YourDb SET MULTI_USER
  • 显然,第一条语句并不总是可以删除所有连接。至少对我来说不是。我必须先杀死连接到数据库的进程。
  • 我现在已经解决了这个问题。我读到here 使用以下语句可能对我的情况有所帮助:Alter database your_db_name set OFFLINE with rollback immediate
【解决方案2】:

恢复向导中点击“关闭与目标数据库的现有连接”

分离数据库向导中点击“Drop connection”项。

【讨论】:

  • 此选项并非始终可用
  • 对于那些想知道为什么该选项并不总是可用的人,有一个解决方法。如果您在执行任何其他操作之前转到选项选项卡并在还原对话框中执行任何其他操作之前选中“关闭现有连接”复选框,它似乎可以解决该选项变灰的问题。
【解决方案3】:

在这里找到它: 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

【讨论】:

  • 谢谢,但这个查询花了超过 2 分钟,所以我取消了它
  • 恕我直言,这是一种不必要的复杂和无效的方法。 @Andomar 的答案以更少的努力完成了同样的事情,并且对飞行中的交易进行了更好的蛮力控制。它也不会捕获在 deprecated sysprocesses 视图中报告了不同数据库但仍在当前数据库上持有锁的用户。
  • 感谢亚伦每周一次的羞辱。它杀死了这个过程,但肯定不是优雅的。
  • 这不是耻辱,而是不仅要向 OP 还要向未来的读者提供有价值的解决方案。如果解决方案存在弱点,我认为应该指出。
  • @Andomar 的回答无济于事,因为连接已经打开!这个脚本就像一个魅力!
【解决方案4】:

你可以像这样使用光标:

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

我在我的博客中写过这个:http://www.pigeonsql.com/single-post/2016/12/13/Kill-all-connections-on-DB-by-Cursor

【讨论】:

    【解决方案5】:

    简答:

    您仅在“数据库上下文 >> 还原向导”中获得“关闭与目标数据库的现有连接”选项并且没有ON 任何特定数据库的上下文

    长答案:

    右键单击您的服务器名称下的数据库,如下所示:

    并从中选择选项:“Restore Database...”。

    在“恢复数据库”向导中,

    1. 选择要恢复的数据库之一
    2. 在左侧垂直菜单中,点击“选项

    您可以在此处找到“关闭与目标数据库的现有连接”的复选框

    只需检查它,您就可以继续进行恢复操作。

    还原完成后,它会自动恢复所有连接。

    【讨论】:

      【解决方案6】:

      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
      

      【讨论】:

      • 它很长,但也是唯一对我有用的解决方案!谢谢
      【解决方案7】:

      在最新版本的 SQL Server Management Studio 中,您现在可以右键单击数据库并“使数据库脱机”。这使您可以选择删除与数据库的所有活动连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 2013-10-07
        • 2016-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多