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

前端之家收集整理的这篇文章主要介绍了c# – ASP.NET中配置数据库中的行以在一定时间后删除的最佳方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我的数据库中有一个表格
  1. Registrants
  2. =======================================================================
  3. id | name | email | registration_date
  4. =======================================================================
  5. 1 | "Sam" | "sammypie49@gmail.com" | "2016-03-26T14:25:10"
  6. -----------------------------------------------------------------------
  7. 2 | "Bob" | "bthebuilder@msn.com" | "2015-12-01T10:09:30"
  8. -----------------------------------------------------------------------
  9. . | . | . | .
  10. -----------------------------------------------------------------------
  11. . | . | . | .
  12. -----------------------------------------------------------------------
  13. . | . | . | .
  14. -----------------------------------------------------------------------
  15. . | . | . | .

我希望每个注册人在注册后100天自动删除.什么是正确的方法,最好的方法是什么?

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

  1. CREATE PROCEDURE FlushOldRegistrants
  2. AS
  3. BEGIN
  4. DELETE FROM Registrants WHERE DATEADD(day,100,registration_date) < GETDATE()
  5. END

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

  1. Script.SetInterval(delegate {
  2. using (var conn = new sqlConnection(connectionString))
  3. using (var command = new sqlCommand("FlushOldRegistrants",conn) {
  4. CommandType = CommandType.StoredProcedure }) {
  5. conn.Open();
  6. command.ExecuteNonQuery();
  7. conn.Close();
  8. }
  9. },60000); // flush old registrants every hour

但是,我可以在数据库级别完成所有操作吗?有可能创建一个这样做的T-sql TRIGGER吗?还是有更好的方法

解决方法

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

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

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

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

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

猜你在找的C#相关文章