我需要一种方法来知道SQL Server中的会话何时关闭,这样我就可以通过运行我拥有的存储过程来清理为该会话分配的任何资源。
当事情完美运行时,客户端应用程序会调用Cleanup
例程来执行此操作。但如果用户意外断开连接,我需要服务器上的一些信息来了解。。。并调用清理。
从VB或Delphi等语言的角度考虑,我会为此注册一个事件处理程序。
我看到SQL Server有"扩展事件",但我还没有弄清楚如何在存储过程或触发器中对这些事件做出反应。。。
或者有其他方法可以捕获SessionClose
,然后调用存储过程吗?
更好!
从这里:检测SQL Server 中客户端的断开连接
您可以为审核注销事件创建事件通知。通知可以启动激活的过程。考虑一下事件通知是异步的。
我最终用Init
|Deinit
类型的函数解决了这个问题。
我使用的是本机兼容存储过程,它们所能获得的信息有限。因此,Init运行得很好——客户端(或包装SP(可以获得所需的信息,传递给Init,并将其存储到会话表中。
客户端在执行任何其他操作之前调用Init
。如果存在与此会话相关联的资源,则假定第一个用户已死亡,并且先前的资源已释放。
极度简化的伪代码:
function Init(info . . .)
begin
if ( isSessionActive(@@spid) )
releaseSession(@@spid)
newSession(@@spid)
end
function Deinit()
begin
releaseSession(@@spid)
end
native-compiled procedure doSomething()
begin
getResources(@@spid, . . . .)
end