use*_*670 6 c# sql t-sql sql-server asp.net
假设我的数据库中有一个表格
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"
-----------------------------------------------------------------------
. | . | . | .
-----------------------------------------------------------------------
. | . | . | .
-----------------------------------------------------------------------
. | . | . | .
-----------------------------------------------------------------------
. | . | . | .
Run Code Online (Sandbox Code Playgroud)
我希望每个注册人在注册后100天自动删除.什么是正确的方法,最好的方法是什么?
我打算做的那种粗制滥造的方式就是创造一个sproc
CREATE PROCEDURE FlushOldRegistrants
AS
BEGIN
DELETE FROM Registrants WHERE DATEADD(day,100,registration_date) < GETDATE()
END
Run Code Online (Sandbox Code Playgroud)
并且在我的服务器端代码中每隔一段时间调用一次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
Run Code Online (Sandbox Code Playgroud)
但是,我可以在数据库级别完成所有操作吗?是否有可能创建一个TRIGGER这样做的T-SQL ?还是有更好的方法?
最明显的方法是使用SQL Server Agent.设置每天或每周运行一次的作业,并让它调用您的存储过程.
另一种选择是将所有数据保留在表中并创建一个视图:
create view v_Registrants as
select r.*
from Registrants r
where registration_date < DATEADD(day, -100, getdate()) ;
Run Code Online (Sandbox Code Playgroud)
通过视图访问数据时,您只能看到最新的数据.这种方法的一个优点是它非常精确 - 您永远不会获得102天或100天和8小时的数据 - 这对使用预定作业来说是一种危险.事实上,如果确切的截止是重要的,您可能需要此视图以及作业.
在这两种情况下,使用此where语句都更安全,因为它可以使用索引(因此应该更快).