0

很简单,我有一个带有 .net 前端的 SQL 数据库,我需要在达到特定时间时触发事件。我称它们为警报,因此用户可以在 x 天的凌晨 12:30 设置闹钟,当 x 天到达该时间时,会出现一个弹出窗口来提醒他们。

实现这一目标的最佳方法是什么,我应该轮询数据库还是尝试使用 SQL 触发器?我以前没有尝试过这个,如果有人有经验,你能解释一下最好的方法吗?以及我应该尽量避免陷入的任何坑洼!

任何见解=很棒

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

澄清一下,可能会连接多个客户端(通常 2 个客户端会一直打开,但可能是所有客户端都出现故障而没有连接)所以我需要考虑警报/弹出窗口是如何发生的。当他们收到弹出警报时,他们可以选择关闭或“操作”它,表示他们已经完成了任务。

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

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

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

在负载方面,我一次看不到超过 15-20 个使用它,但通常只有 5-6 个左右。

有任何明显的遗漏或担忧吗?

4

3 回答 3

2

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

我过去使用过以下所有...

1.使用外部应用程序

如果有需要了解事件的应用程序,请在应用程序中对事件进行计时。

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

2. 代理

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

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

如果您有多个客户端应用程序,则类似于选项 1,但 SQL Server 成为中央应用程序,客户端轮询服务器以了解正在发生的事情。

3.无限循环

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

笔记

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

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

于 2011-10-25T16:09:15.593 回答
2

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

谁会看到这些警报?它们真的会是客户端机器上的弹出窗口吗?如果树林里出现弹窗,没人看,那还有报警吗?

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

应用程序可以每隔一段时间(每分钟一次?每 10 分钟一次?)重新轮询服务器,以查看系统中是否设置了任何新警报。这里的缺点是,如果有人进入并立即创建警报,那么它可能不会弹出,直到下一次数据库轮询。这将帮助您确定需要多久进行一次轮询的业务规则。

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

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

于 2011-10-25T17:31:07.310 回答
1

一种方法是让客户端一直监听 DATBASE,并在数据库发生变化时在本地引发事件。这是我的关于那个

编辑:

如果您想延迟执行某些操作以供将来使用,还有很棒的 SQL 命令waitfor

于 2011-10-25T17:41:25.377 回答