为什么在我的SQL Server上删除了一个全局临时表?



我们在程序中使用全局临时表,用c++编写,使用ATL作为DB接口。会话是通过SQL OLE DB提供程序建立的。

这个全局临时表被保存很长时间,可能是整个会话的时间。当特定操作/活动结束时,我们会显式删除这些临时表。所以我们总是清理桌子。

现在我们看到对使用缓慢或不稳定VPN连接的人的影响,全局临时被删除。应该读取某些内容的查询返回错误

# # tblTemp……不是一个有效的对象名

对我来说,这是一个指示符,SQL Server终止会话。

怎么可能呢?我们的程序具有至少每5分钟访问一次服务器的内部函数(即使用户处于非活动状态)。通常访问SQL Server的频率要高得多。但是程序可能会在后台被最小化。

SQL Server终止会话并删除临时表的超时是多少?

我在服务器设置中看到Remote Query Timeout。但这对我来说似乎是错误的,因为我们这里没有开放的查询…对表的查询也非常简单。插入、删除记录

问题:

  1. 我在哪里找到这个会话超时的设置?

  2. 客户端是否有办法发现会话被终止?奇怪的是,SQL查询本身被转移到SQL Server,最终失败,因为临时表不再存在。客户端出现其他错误

  3. 是否有办法在服务器上达成协议?

编辑:

下面是我们如何使用这些表的更多细节。

  • 这些表是在主线程中创建的。这个线程有一个SQL会话,它在程序开始时创建,并在程序结束时结束。其他线程使用临时表。我们通过它传递名字。

因此,由于创建SQL会话仍然是活的,并且在执行使用临时表的语句时没有显示错误,它告诉我会话仍然是活的。但是我的问题是对象似乎要被删除。

再次说明:我们只在VPN连接到服务器的机器上有这个问题!

引用手册:

当创建临时表的会话结束并且所有其他任务停止引用临时表时,全局临时表将被自动删除。任务和表之间的关联仅在单个Transact-SQL语句的生命周期内维护。这意味着在创建会话结束时主动引用表的最后一个Transact-SQL语句完成时,将删除全局临时表。

来源所以这不是关于每隔几分钟访问一次服务器,而是关于特定的对象被引用。

如果创建全局临时表的会话已经结束(例如超时),并且没有其他积极地引用同一表,它将被丢弃!

最新更新