0

我需要一种方法来知道 SQL Server 中的会话何时关闭,以便我可以通过运行我拥有的存储过程来清理为该会话分配的任何资源。

当一切运行良好时,客户端应用程序将调用一个Cleanup例程来执行此操作。但是,如果用户意外断开连接,我需要服务器上的一些东西知道......并调用清理。

考虑到像 VB 或 Delphi 这样的语言,我会为此注册一个事件处理程序。

我看到 SQL Server 有“扩展事件”,但我还没有弄清楚如何在存储过程或触发器中对这些事件做出反应......

还是有其他方法可以捕获SessionClose然后调用存储过程?

4

2 回答 2

0

我最终用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
于 2021-03-23T18:23:09.607 回答
0

更好!

从这里:检测 SQL Server 中客户端的断开连接

您可以为审核注销事件创建事件通知。该通知可以启动一个激活的程序。考虑一下事件通知是异步的。

于 2021-03-25T15:58:09.927 回答