在SQL数据库上触发事件的最佳方法

时间:2011-10-25 15:58:15

标签: .net sql triggers scheduling alarms

很简单,我有一个带有.net前端的SQL数据库,我需要在达到特定时间时引发事件。我将它们称为警报,因此用户可以设置警报,例如在x天上午12:30,当在x天达到该时间时,会出现提示它们的弹出窗口。

实现这一目标的最佳方法是,我应该轮询数据库还是尝试使用SQL触发器? 我之前没有尝试过,如果有人有经验,你能否对最佳方法有所了解?我应该尽量避免陷入任何坑洼!

任何见解=很棒

是的抱歉触发了我的另一个项目(睡眠不足)。

为了澄清,可以连接多个客户端(通常2个将始终打开,但可能是所有内容都已关闭但没有连接的情况)所以我需要考虑警报/弹出窗口是如何发生的。当他们收到弹出警报时,他们可以选择解雇或“动作”它,说他们已完成任务。

根据警报的信息,应该通知不同的用户,即如果选择了某些人将不会收到警报(希望通过活动目录登录实现此目的并保留当前用户的表并将每个用户分配给一个区域)所以人们只会在那里看到警报,而其他人可能只会收到所有警报。

感谢所有输入:听起来我想要一个中央程序或服务?

我可以拥有一个服务,不断轮询数据库检查警报时间和当前活动用户,如果发现它更新了一个通知表,用户页面轮询每隔几秒钟(10)(澄清:警报时间,应该是提前放好,警报通知不需要秒精确)。听上去怎么样?。

就负载而言,我一次看不到超过15-20左右,但通常只有5-6左右。

任何明显的遗漏或担忧?

3 个答案:

答案 0 :(得分:2)

当数据库中发生某些事情时,触发器被激活。

我过去曾使用过以下所有内容......

<强> 1。使用外部应用程序

如果有应用程序需要了解该事件,请在应用程序中为事件计时。

如果有多个客户,您需要协调它们。使用中央主应用程序或某些同步过程。

<强> 2。剂

MS SQL Server能够设置时间并重复触发某些SQL的事件。

如果没有需要触发此事件的外部客户端应用程序,这些非常有用。

如果您有多个客户端应用程序,它就像选项1,但SQL Server成为中央应用程序,客户端轮询服务器以了解发生了什么。

第3。无限循环

代替(或者说)代理,您可以编写一个永不停止的循环,并使用WAIT类型命令暂停,直到下一个事件到期。

注意

什么是最好的取决于你实际将要对这些事件做什么。轮询不是问题,但通常最好有一个点来控制事件的发射。

请注意,您(通常)不希望从客户端连接到永远打开的SQL Server。并且您无法打开SQL Server与一堆客户端应用程序的连接。因此,应用程序无论如何都需要轮询服务器。但是你可以对投票很聪明。

答案 1 :(得分:2)

我认为你没有正确理解触发器。它们根据所采取的操作启动(例如,将行插入表中)。它们不是基于时间的。根据你的解释,我认为这不是你想要的。

谁会看到这些警报?他们真的会在客户端机器上弹出窗口吗?如果树林里出现一个弹出窗口并且没有人可以阅读它,那还有警报吗?

我的第一个,虽然信息有限,但是客户端会在首次打开时加载任何警报数据。如果错过了任何警报(即当他们没有登录系统时它们应该已经关闭),那么它们会立即弹出(最好带有他们过去的视觉提示)。然后,可以将在不久的将来安排的任何其他警报设置为在适当的时间启动。

应用程序可以经常重新启动服务器(每分钟一次?每10分钟一次?),看看系统中是否有新的警报设置。这里的缺点是,如果有人进入并立即创建警报,那么在下次轮询数据库之前它可能不会弹出。这将帮助您确定有关轮询需要执行的频率的业务规则。

关于这种方法的一些附加说明......您需要将警报标记为已经“处理”,以便它们不会再次弹出。此外,您需要确保客户端的时钟与服务器同步。另外,您需要考虑不同的时区吗?

另一种可能的方法是让中央服务器轮询数据库并向客户端发送警报。这可以使每个客户端不必不断轮询数据库(您只有一个轮询器),但它不会捕获“错过”的警报。如果您总是连接了许多客户端并且需要发送“全球”警报,那么这可能就是路由。如果警报是用户特定的,那么我将采用第一种方法。

答案 2 :(得分:1)

其中一种方法是客户端一直监听DATBASE,并在数据库中发生变化时在本地升级事件。 Here is my SO about that

编辑:

如果你想延迟执行某些事情

,那么还有很棒的SQL命令waitfor