J A*_*son 6 sql-server sql-server-2012
所以我们有一个糟糕的外部应用程序,它连接到数据库,执行一个存储过程并得到一个答案。
它永远不会释放数据库连接。
我需要一个脚本来终止一个用户的所有会话,或者我需要一个脚本来终止特定数据库 x 小时不活动的所有会话
有人有这样的事情吗?
Aar*_*and 14
将会话固定到特定数据库sysprocesses
并没有真正可靠的方法(有这个,但它依赖于活动查询的数据库上下文,并且dm_exec_sessions
有authenticating_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,但这很快就会变得非常乏味。