sql -基于计时器的事件触发器

Translate

我目前正在从事具有特定要求的项目。这些内容的简要概述如下:

  • 从外部Web服务检索数据
  • 数据存储在SQL 2005中
  • 通过Web GUI操纵数据
  • 与Web服务通信的Windows服务与我们的内部Web UI无关,除非通过数据库。
  • 与Web服务的通信既需要基于时间,又需要通过用户对Web UI的干预来触发。

Web服务通信触发的当前(预生产)模型是通过数据库表存储的,该表存储从手动干预生成的触发请求。我并不是真的想要多种触发机制,但是希望能够根据调用时间使用触发来填充数据库表。如我所见,有两种方法可以实现此目的。

1)修改触发器表以存储两个额外的参数。一个是“是基于时间的还是手动添加的?”一个可为空的字段,用于存储时序细节(要确定的确切格式)。如果它是手动创建的触发器,则在触发该触发器时将其标记为已处理,但如果是定时触发器则不将其标记为已处理。
or
2)创建第二个Windows服务,该服务以定时间隔即时创建触发器。

第二个选项对我来说似乎是个小菜一碟,但是选项1的管理很容易变成编程的噩梦(如何知道表的最后一次轮询是否返回了需要触发的事件,以及如何停止它?在下次投票时重新触发)

如果有人能抽出几分钟来帮助我决定选择哪条路线(这两条路线之一,或者可能是第三条未列出的路线),我将不胜感激。

This question and all comments follow the "Attribution Required."

所有的回答

Translate

为什么不使用SQL Job代替Windows Service?您可以在存储过程中封装所有的数据库“触发”代码。然后,您的UI和SQL Job可以调用相同的存储过程并以相同方式(无论是手动还是在一定时间间隔)创建触发器。

来源
Translate

我的看法是这样。

您有一个Windows服务,它扮演调度程序的角色,其中有一些类可以简单地调用Web服务并将数据放入数据库中。

因此,您也可以直接从WebUI使用这些类,并基于WebUI触发器导入数据。

我不喜欢将用户生成的操作作为标志(触发)存储在数据库中的想法,某些服务将在该数据库中轮询该标志(触发的时间间隔不受用户控制)以执行该操作。

您甚至可以将整个代码转换为exe,然后可以使用Windows Scheduler进行调度。每当用户从Web UI触发操作时,都调用同一exe。

来源
Translate

@Vaibhav

不幸的是,该解决方案的物理体系结构不允许组件之间进行任何直接通信,除了Web UI到数据库以及数据库到服务(然后可以调出到Web服务)。但是,我同意在这里重用通信类是理想的-我只是不能在我们的业务范围内这样做*

*技术上“更好”的解决方案是否总是受到外部因素的阻碍?

来源