在 MS SQL 中杀死一个用户的所有会话

J A*_*son 6 sql-server sql-server-2012

所以我们有一个糟糕的外部应用程序,它连接到数据库,执行一个存储过程并得到一个答案。

它永远不会释放数据库连接。

我需要一个脚本来终止一个用户的所有会话,或者我需要一个脚本来终止特定数据库 x 小时不活动的所有会话

有人有这样的事情吗?

Aar*_*and 14

将会话固定到特定数据库sysprocesses并没有真正可靠的方法(有这个,但它依赖于活动查询的数据库上下文,并且dm_exec_sessionsauthenticating_database_id,但这依赖于连接字符串、登录的默认数据库等)。

也就是说,这似乎满足了您的所有其他要求,尝试使用app_name、connection aslogin_name和 who 未在过去 5 小时内发出请求来终止所有会话:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'KILL ' + CONVERT(VARCHAR(11), session_id) + N';'
FROM sys.dm_exec_sessions
  WHERE [program_name] = N'app_name'
  AND login_name = N'login_name'
  AND last_request_start_time < DATEADD(HOUR, -5, SYSDATETIME());

EXEC sys.sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)

如果应用程序所做的只是调用该存储过程,而根本不执行任何其他操作,您或许可以查看DBCC INPUTBUFFER每个 spid,但这很快就会变得非常乏味。