加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – ASP.NET中配置数据库中的行以在一定时间后删除的最佳方法

发布时间:2020-12-15 04:29:08 所属栏目:百科 来源:网络整理
导读:假设我的数据库中有一个表格 Registrants======================================================================= id | name | email | registration_date======================================================================= 1 | "Sam" | "sammypi
假设我的数据库中有一个表格
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天自动删除.什么是正确的方法,最好的方法是什么?

我打算做的那种粗制滥造的方式就是创造一个sproc

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

并且在我的服务器端代码中每隔一段时间调用一次sproc就像

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代理.设置每天或每周运行一次的作业,并让它调用您的存储过程.

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

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

通过视图访问数据时,您只能看到最新的数据.这种方法的一个优点是它非常精确 – 您永远不会获得102天或100天和8小时的数据 – 这对使用预定作业来说是一种危险.事实上,如果确切的截止是重要的,您可能需要此视图以及作业.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读