存储过程将终止与所选数据库或服务器的所有连接
SQL存储过程将终止与选定数据库或服务器的所有连接,但调用该进程的进程除外。
介绍
有时您需要断开所有用户与数据库的连接,其中一个示例是“日志传送”复制。下面的代码在每20分钟更新一次的报表服务器上使用,因为还原任务需要以独占模式打开数据库。
下面的代码将接受一个数据库名称,因此只需编写一次即可并将其存储在master或Utility(如果已创建)数据库中。然后可以从任何其他过程中调用它,对于我们来说,是上面文档中完整的维护计划。
这是一个非常简单的存储过程,它仅获取活动连接的列表,并循环遍历每个连接,从而杀死进程和连接。
SQL Code
CREATE PROC maint.KillConnections(@database VARCHAR(50)) AS BEGIN
SET NOCOUNT ON;
DECLARE @spid INT
DECLARE @killstatement NVARCHAR(10)--Declare a cursor to select the users connected to the specified database
DECLARE c1 CURSOR FAST_FORWARD FOR SELECT request_session_id
FROM sys.dm_tran_locks
WHERE resource_type='DATABASE'
AND (DB_NAME(resource_database_id)=@database OR @database IS NULL)
OPEN c1
FETCH c1 INTO @spid
WHILE @@FETCH_STATUS= 0 BEGIN
IF @@SPID<>@spid--Don't kill the connection of the user executing this statement
BEGIN
-- Construct dynamic sql to kill spid
SET @killstatement ='KILL '+CAST(@spid AS VARCHAR(5))
EXEC sp_executesql @killstatement
PRINT @spid -- Print killed spid
END
FETCH NEXT FROM c1 INTO @spid
END
-- Clean up
CLOSE c1
DEALLOCATE c1
END
GO