【发布时间】:2012-04-30 17:39:35
【问题描述】:
我想关闭与 MS SQL Server 的现有连接,以便我可以通过编程方式对该数据库进行恢复。
【问题讨论】:
标签: sql sql-server
我想关闭与 MS SQL Server 的现有连接,以便我可以通过编程方式对该数据库进行恢复。
【问题讨论】:
标签: sql sql-server
这应该会断开其他所有人的连接,并让您成为唯一的用户:
alter database YourDb set single_user with rollback immediate
注意:不要忘记
alter database YourDb set MULTI_USER
完成后!
【讨论】:
ALTER DATABASE YourDb SET MULTI_USER!
Alter database your_db_name set OFFLINE with rollback immediate
在恢复向导中点击“关闭与目标数据库的现有连接”
在分离数据库向导中点击“Drop connection”项。
【讨论】:
在这里找到它: 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
【讨论】:
你可以像这样使用光标:
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
【讨论】:
您仅在“数据库上下文 >> 还原向导”中获得“关闭与目标数据库的现有连接”选项并且没有ON 任何特定数据库的上下文。
右键单击您的服务器名称下的数据库,如下所示:
并从中选择选项:“Restore Database...”。
在“恢复数据库”向导中,
您可以在此处找到“关闭与目标数据库的现有连接”的复选框
只需检查它,您就可以继续进行恢复操作。
还原完成后,它会自动恢复所有连接。
【讨论】:
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
【讨论】:
在最新版本的 SQL Server Management Studio 中,您现在可以右键单击数据库并“使数据库脱机”。这使您可以选择删除与数据库的所有活动连接。
【讨论】: