如何拥有数据库触发器代码

时间:2011-01-30 06:10:20

标签: c# sql-server asp.net-mvc linq

我需要一些帮助...

此表我有一个日期列,当该列中的任何日期等于服务器日期时,我需要告诉我的网站/程序发送电子邮件或执行某些通知操作以让用户知道点什么。

我在考虑在服务器上运行一个程序,以一定的间隔轮询数据库,但问题是如果日期是01/31/11 10:30 AM,我的间隔是每隔5分钟有可能民意调查不准确,即上午10:35的民意调查。换句话说,我需要数据库以某种方式通知在“x”日期恰好在该日期被命中的情况。

我想避免以1秒的间隔检查数据库,因为我认为这会对性能造成巨大影响。

我正在使用ASP.NET MVC 3和MSSQL以及LINQ实体框架。

任何有创意的想法?

7 个答案:

答案 0 :(得分:1)

您可以使用Quartz.net来设置这些事件。 Quartz非常灵活且功能强大 - 它适用于此类事物。

答案 1 :(得分:1)

没有数据库触发代码。让触发器在另一个表中创建一行,其中包含有关刚刚发生的事情的信息。

有一个单独的程序定期从第二个表中读取给电子邮件用户或您需要做的任何事情。让该程序在完成电子邮件后从表中删除该行。

答案 2 :(得分:1)

我没有任何个人经验,但Sql Server CLR集成可能是您正在寻找的答案。从描述中可以看出,您几乎可以编写任何可以针对.NET框架进行编译并将其部署到sql server实例的内容,而Sql Server将能够执行它。 http://msdn.microsoft.com/en-us/library/ms254498.aspx

答案 3 :(得分:0)

您需要使用调度程序(例如Oracle中的DBMS_SCHEDULER或SQL Server作业等)或者找到一些第三方工具,例如Quartz.net,如另一个响应者所提到的。或者可能将以下内容编写为轮询应用程序

 select all jobs due in next 5 minutes, order by due date
 while there are jobs
    if the next job is due action it
    else sleep for duration of interval till job due
 loop

答案 4 :(得分:0)

这有点脏,但我认为它会为您提供所需的功能。

在Global.asax.cs

public DateTime LastMaxDateTime;

protected void Application_Start(object sender,EventArgs e)
{
    LastMaxDateTime = GetMaxDateTime();

    Thread bgThread=new Thread(BackgroundThread_CheckDatabase);
    bgThread.IsBackground=true;
    bgThread.Start();
}

private void BackgroundThread_CheckDatabase()
{
    while(true)
    {
        DateTime dtMaxDateTime = GetMaxDateTime();
        if(dtMaxDateTime > this.LastMaxDateTime)
        {
            //Send Notifications
            this.LastMaxDateTime=dtMaxDateTime;
        }

        Thread.Sleep(5000); //5 seconds
    }
}

private DateTime GetMaxDateTime()
{
     //function that returns DateTime from something like "SELECT MAX(DateTimeColumn) FROM [MyTable]"
}

基本上,代码会跟踪表中和每次轮询中的最新DateTime,检查自上次检查以来数据库中是否有更新的DateTime。如果是这样,您可以发送通知。如果您不希望表格中的许多记录可能导致竞争条件,那么我认为这不是一个快速解决方案的问题。

答案 5 :(得分:0)

最有效的方法是让应用程序代替轮询运行事件驱动。

例如,让一个线程在数据库中查询最早的预定事件并在此之前休眠。然后让另一个线程同步等待表更改(例如在PostgreSQL中这将是NOTIFY / LISTEN语句)并通知第一个线程以检查最早的事件是否已更改。

答案 6 :(得分:0)

最简单的方法是跟踪上次检查的日期。再次检查时,请拉出大于上次检查日期且小于或等于新检查日期的所有行。为确保执行它们,您可以在执行操作时添加一列并更新该列。使用该新列的索引,对于具有NULL DateExecuted的行,每秒检查一次应该没有任何性能问题。

您还可以提前阅读并按触发日期对即将开始的项目进行排序,并执行Thread.Wait()直到下一个项目准确无误。