c# - ASP.NET 中将数据库中的行配置为在特定时间后删除的最佳方法

标签 c# sql asp.net sql-server tsql

假设我的数据库中有一个表

                           Registrants
=======================================================================
  id |    name    |            email        |    registration_date
=======================================================================
  1  |   "Sam"    | "sammypie49@gmail.com"  |    "2016-03-26T14:25:10"
-----------------------------------------------------------------------
  2  |   "Bob"    | "bthebuilder@msn.com"   |    "2015-12-01T10:09:30"
-----------------------------------------------------------------------
  .  |     .      |           .             |              .
-----------------------------------------------------------------------
  .  |     .      |           .             |              .
-----------------------------------------------------------------------
  .  |     .      |           .             |              .
-----------------------------------------------------------------------
  .  |     .      |           .             |              .

而且我希望每个注册人在注册后 100 天自动被删除。执行此操作的正确方法是什么,最好的方法是什么?

我计划这样做的劣质方法是创建一个存储过程

CREATE PROCEDURE FlushOldRegistrants
AS
BEGIN
   DELETE FROM Registrants WHERE DATEADD(day,100,registration_date) < GETDATE()
END

并且在我的服务器端代码中每隔一段时间调用一次存储过程

Script.SetInterval(delegate {
    using (var conn = new SqlConnection(connectionString))
using (var command = new SqlCommand("FlushOldRegistrants", conn) { 
                           CommandType = CommandType.StoredProcedure }) {
   conn.Open();
   command.ExecuteNonQuery();
   conn.Close();
}
 }, 60000); // flush old registrants every hour

但是,我可以在数据库级别完成所有这些吗?是否可以创建执行此操作的 T-SQL TRIGGER?或者有更好的方法吗?

最佳答案

最明显的方法是使用SQL Server Agent。设置一个每天或每周运行一次的作业,并让它调用您的存储过程。

另一种选择是将所有数据保留在表中并创建一个 View :

create view v_Registrants as
   select r.*
   from Registrants r
   where registration_date < DATEADD(day, -100, getdate()) ;

当您通过 View 访问数据时,您只会看到最新的数据。这种方法的一个优点是它是精确的——您永远不会得到 102 天或 100 天零 8 小时的数据——这是使用计划作业的危险。事实上,如果确切的截止日期很重要,您可能想要这个 View 以及这份工作。

在这两种情况下,使用此 where 语句会更安全,因为它可以利用索引(因此应该更快)。

关于c# - ASP.NET 中将数据库中的行配置为在特定时间后删除的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36104557/

相关文章:

c# - 从 .Net Core 2.1 使用 WCF 服务器时出错,但在 .NET 上没问题

c# - RavenDB 查询不再在 LinqPad 中工作

sql - TSQL - 带条件的时间列总和

mysql - 如何将查询结果存入mysql的变量中

php - 页面在登录时重定向到索引

c# - ASP.NET 在子目录中运行应用程序

c# - 如何配置 Fluent NHibernate 以将查询输出到 Trace 或 Debug 而不是控制台?

c# - 使用 TSQL 或 Azure API C# 在弹性池中的故障转移组中添加和删除 Azure 数据库

c# - 使用 ReadOnlySpan<char> 处理转义序列

c# - 如何在 Gridview 中使用单个 LinkBut​​ton 来更新 aspx 页面上其他位置的 TextBox