1

就像我的标题所描述的那样:我如何在 SQL Server 2008 中实现类似看门狗服务的功能,并执行以下任务:当在该表上提交太多插入时发出警报或执行操作。

例如:错误表在正常情况下在一秒钟内收到 10 条错误消息。如果在一秒钟内超过 100 条错误消息(100 条插入),则:ALERT!

如果您能帮助我,将不胜感激。

PS:不。SQL Jobs 不是一个选项,因为看门狗应该是实时的 :-) 集成服务?有没有更简单的方法来实现这样的服务?

亲切的问候,萨尼

4

1 回答 1

0

我不完全理解你的问题,所以我不完全确定我的答案是否真的解决了任何问题,或者只是让潜在的问题变得更糟。尤其是当您面临性能或并发问题时,这可能行不通。

如果您可以更新原始表,只需添加一个 datetime2 字段,如

InsertDate datetime2 NOT NULL DEFAULT GETDATE()

最好在表上创建一个索引,然后以任何适合的间隔,通过查看有多少行具有 InsertDate > GetDate - X 来轮询表。

对于这种特殊情况,您可能会受益于将轮询过程读取为未提交(或使用WITH NOLOCK),尽管这样做时必须小心。

如果您无法修改表本身,并且您不能或不会让另一个流程或作业监控相关变量,我建议您执行以下操作:

  1. 制作一个只有一个 Datetime2 列的“计数器”表。
  2. 在原始表上,创建一个 AFTER INSERT 触发器:

    • 删除日期时间字段早于 X 秒的所有行。
    • 用当前时间插入一行。
    • 计数以查看计数器表中现在是否存在太多行。
    • 必要时采取行动 - 即。通过执行将向发件人发出信号/抛出异常/发送邮件/无论什么的过程。

如果您可以修改原始表,请将 datetime 列添加到该表中,并使触发器对所有尚未 X 秒旧的行进行计数,并在必要时采取行动。

我还会考虑让另一个进程(即 SQL 作业或自制服务或类似服务)来完成所有的内务管理,即。删除旧行,计算行数并对其进行操作。将其保留为触发器的工作不是一个好的设计,从长远来看可能会导致问题。

如果可能的话,您应该考虑让其他进程来进行内务处理。

更新:更好的解决方案可能是将触发器插入通知(即日期时间)到队列中 - 如果您随后有一些东西正在监听该队列,您可以编写逻辑来确定您的阈值是否已超过。但是,这将需要您将一些逻辑转移到另一个流程中,我最初认为这不是一种选择。

于 2012-07-09T20:20:04.720 回答