2015-07-19 25 views
0

我在其中一个表中有一列充当倒计时。因此,当当前日期时间接近endtime时,它会下降到0.倒数的值在达到endtime后变为0。发生这种情况时,我希望它能触发一个存储过程。有谁知道我可以如何创建这样的触发器?Sql Server数据库存储过程在值变为0时触发

表:

CREATE TABLE t1 (
id int IDENTITY, 
enddate datetime NOT NULL, 
daysleft AS (DATEDIFF(dd, GETDATE(), enddate)) 
); 

INSERT INTO t1 (enddate) 
VALUES(DATEADD(dd, 1, GETDATE())), 
(DATEADD(dd, 2, GETDATE())), 
(DATEADD(dd, 15, GETDATE())) 

我还没有创建过程的是,不仅是因为这将是无用的,如果我不能创建我需要触发。

+0

包含一些代码。 – HaveNoDisplayName

+0

刚加了表,如果有帮助 – Vigs

回答

0

我不认为在SQL Server中有一个构造允许您在数据值等于用户定义值时运行存储过程。这背后的原因是,如果要这样做,SQL Server的性能会受到巨大影响。

相反,我会建议您考虑编写一个定期醒来的Windows服务,并检查表中是否有任何行已过期,然后调用您的预期存储过程。如果你愿意,我可以给你一个如何达到这个目的的例子。


编辑:Windows服务

好了的样品执行情况,我上面说的,不存在当特定的数据已达到其到期时间被通知的方式。因此,我们不是处于推送通知模式,而是处于拉通知模式,我们定期查询数据库中的过期行(例如"SELECT id FROM t1 WHERE enddate = @todayDate"

此解决方案的关键部分是我们需要定期服务。这已在其他用户的回答here中得到证明。我们将执行SQL操作的方法是private void timer_Elapsed(...)。此代码的

private void timer_Elapsed(object sender, System.Timer.ElapsedEventArgs e) 
{ 
    // since I am not sure whether you are accessing your database using ADO.NET 
    // (i.e. SqlConnection, etc.) or Entity Framework (i.e. DbContext), 
    // I will assume ADO.NET from here on 

    // retrieve all rows that have expired 
    using (var connection = new SqlConnection(connectionString)) 
    { 
     connection.Open(); 

     var command = new SqlCommand("SELECT id FROM t1 WHERE enddate = @todayDate", connection); 
     var paramDate = new SqlParameter("@todayDate", DateTime.Now.Date); 
     command.Parameters.Add(paramDate); 
     var reader = command.ExecuteReader(); 

     while (reader.Read()) 
     { 
      var storedProcCommand = new SqlCommand("EXEC CleanUpExpiredRow @id", connection); 
      var paramId = new SqlParameter("@id", reader.GetInt32(0)); 
      storedProcCommand.Parameters.Add(paramId); 
      command.ExecuteNonQuery(); 
     } 
    } 
} 

无进行测试。

+0

我非常想这么做! – Vigs

+1

要添加到Parth的注释中,SQL Server触发器将响应数据库事件而不是条件表达式,具体为:DDL事件--CREATE TABLE,DROP TABLE,ALTER TABLE和DML事件 - INSERT,UPDATE,DELETE。另一个建议包括在客户端/应用程序级别'daysleft = 0'时运行此插入查询。这与[关于使用存储过程的当前争论]有关(http://programmers.stackexchange.com/questions/65742/stored-procedures-a-bad-practice-at-one-of-worlds-largest-it - 软件咨询)如何从数据库流程中抽象业务逻辑。 – Parfait

+0

@Parfait我同意这个辩论,但是我已经走到了EntityFramework的道路上,并且在强制执行数据安全性时我的手烧得相当糟糕(即只有那些有足够数据访问权限的人才能够读/写/删除该数据)。就我而言,用户身份验证机制是Forms,而不是内置的SQL Server。除了存储过程之外,我还没有找到强制执行数据安全的方法,可以让我安全地说我不担心敏感数据被错误的人访问。 –

相关问题