Sql server 如何将临时的自毁数据存储到t-sql表中?

Sql server 如何将临时的自毁数据存储到t-sql表中?,sql-server,tsql,temporary,Sql Server,Tsql,Temporary,假设我有一个包含相关信息的表。但是,数据只与30分钟相关 在那之后,它只是数据库垃圾,所以我需要尽快清除它 如果需要,我可以定期清理此表,分别为每条记录设置过期日期和时间,并通过作业或其他方式删除过期记录。这是我的#1选择,除非有人说服我,否则我会这么做 但我认为这个解决方案可能有问题。如果有人停止运行作业,但没有人注意到,该怎么办?我正在寻找一种类似于将临时数据插入表的内置方法。或者一个本身具有“易失性”数据的表,在插入x个时间后自动删除数据 最后但并非最不重要的一点是,如果没有内置的方法来实

假设我有一个包含相关信息的表。但是,数据只与30分钟相关

在那之后,它只是数据库垃圾,所以我需要尽快清除它

如果需要,我可以定期清理此表,分别为每条记录设置过期日期和时间,并通过作业或其他方式删除过期记录。这是我的#1选择,除非有人说服我,否则我会这么做

但我认为这个解决方案可能有问题。如果有人停止运行作业,但没有人注意到,该怎么办?我正在寻找一种类似于将临时数据插入表的内置方法。或者一个本身具有“易失性”数据的表,在插入x个时间后自动删除数据

最后但并非最不重要的一点是,如果没有内置的方法来实现这一点,我自己是否能够在SQL server 2008(或2012,我们将很快进行迁移)中实现这一功能?如果是这样的话,有没有人能给我一些指导,告诉我应该寻找什么来实现类似的东西


(如果格式不好,很抱歉,第一次使用智能手机发布内容)

请参阅@Yuriy comment,这是相关的

如果您真的需要在DB端实现它

截断表是清除记录的快速方法。 如果您需要的是<强> > <强>表,您只需要填写数据,使用它并尽快处理它,您可以考虑截断一个(永久的)“CaseEffTimp”表。 当您运行并发线程/作业并且每个线程/作业都在处理自己的数据时,场景可能会变得更加复杂

如果该数据只存在于单个“作业”/上下文中,可以考虑使用“临时表”。它们有点不稳定,可能就是你想要的


此外,您也可以使用表变量,它们比临时表更易变,但这取决于您没有发布的内容,所以我不能说什么更好。

正如另一个答案所指出的,截断表是删除表内容的一种快速方法,但它具有攻击性;它会把桌子完全清空。此外,对其使用也有限制;除其他外,它不能用于“”的表

任何更有针对性的行删除都需要带有WHERE子句的DELETE语句。在相关的条件字段(例如插入日期)上建立索引将提高删除的性能,这可能是一个好主意(取决于它对INSERT和UPDATE语句的影响)

您需要一些东西来“触发”DELETE语句(或TRUNCATE语句)。正如您所建议的,SQL Server代理作业是一个明显的选择,但您担心该作业会被禁用或删除。任何解决方案都很容易被人删除你的工作,但有比工作更模糊的方式触发活动。您可以将删除嵌入到插入过程中——无论是在任何存储过程或应用程序代码中,还是作为实际的表触发器。这两种方法都会增加插入所需的时间,而且由于SQL Server代理不会在带外处理这些方法,因此用户需要稍长的等待时间。如果您有正确的索引,并且表的大小合理,那么这可能是一个可以接受的折衷方案


据我所知,SQL Server没有任何其他功能可以开始删除数据。没有自动执行数据保留策略。

您确定要在SQL端执行此操作吗?这听起来像缓存,您最好使用其他缓存解决方案(例如ASP.NET具有缓存机制等)。您可以创建表,并将Sql Server代理作业设置为按设置的时间间隔定期截断。如果我定期截断它,我会意外杀死许多尚未过期的记录。我还想在SQL端这样做,因为许多不同的机器可能会查询/插入数据到这个表中。我觉得仅仅为一个功能构建分布式缓存是过分的,它会给我带来更多的问题,而不是解决它们。为了更好地解释这一点,此表将是一个简短的事件日志,这些事件可能会在读取时暂时改变其他计算机的行为。
TRUNCATE
将删除所有记录,包括尚未过期的记录。感谢您的响应。出于好奇,我想SQL server不能扩展到这一点?我的意思是,如果不使用触发器,我假设我无法创建另一种“类型”的表,它可以在插入数据时处理此任务。是吗?有很多创造性的方法来完成清除,但它仍然需要被触发。静止的数据往往保持静止。:)你可以编写一个单独的应用程序,它有自己的计时器——甚至是在操作系统级别,比如一个计划任务。您可能能够以某种方式使用ServiceBroker,但最终需要调用服务。您可能会做一些奇怪的事情,比如根据维护计划或其他一些可预测的事件使用DDL触发器,但这基本上还是由SQL Server代理决定的。