【问题标题】:Why a global temporary table is deleted on my SQL Server?为什么在我的 SQL Server 上删除了全局临时表?
【发布时间】:2021-11-19 08:32:40
【问题描述】:

我们在程序中使用全局临时表,用 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 连接缓慢/不良的机器上遇到此问题!

【问题讨论】:

  • 听起来全局会话范围的对象不是您所需要的,只需直接将您的表创建为 tempdb.dbo.table,它将一直保留到您的应用删除它或服务器重新启动。
  • 听起来,老实说,他们真正需要的根本不是临时的,他们应该将数据存储在用户数据库中的永久表中(和 l 同一个表,没有多少表),如果他们希望在完成后删除这些数据,DELETE it。
  • 主要会话是临时的!它也是少量数据,访问应该是内存缓冲的......所有这些都是全局临时表提供的。而且我不需要临时表的 DDL 权限。数据写入器就足够了。
  • 访问应该是内存缓冲的 这对任何表都是如此,一旦数据被读取,它就会保留在缓冲区缓存中;如果您假设 ##table 未写入磁盘,那是不正确的。
  • 仅在 tempdb 或用户数据库中创建用户表并根据需要将其用于临时/中间数据,而在不再需要时删除数据会有什么问题。是否存在使用全局临时表来解决的问题?

标签: sql-server session temp-tables session-timeout


【解决方案1】:

引用手册:

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

source

所以不是每隔几分钟访问一次服务器,而是引用特定的对象

如果创建全局临时表的会话已结束(例如超时)并且没有其他主动引用同一个表,则将其删除!

【讨论】:

  • 我认为您需要确定“使用它们”是什么意思。如果没有涉及该表的活动的、打开的事务,则它不再“在使用中”。
  • 对不起。删除了我的评论。需要验证一些东西。
  • 感谢您的回答。我重新详细检查了这一点。我为我的问题添加了新评论。该表应该存在,因为它是在我的主线程中创建的,因此在我的主会话中仍然存在......
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 2012-10-17
  • 2011-12-17
  • 2014-09-01
  • 2012-02-13
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多