就像我的标题所描述的那样:我如何在 SQL Server 2008 中实现类似看门狗服务的功能,并执行以下任务:当在该表上提交太多插入时发出警报或执行操作。
例如:错误表在正常情况下在一秒钟内收到 10 条错误消息。如果在一秒钟内超过 100 条错误消息(100 条插入),则:ALERT!
如果您能帮助我,将不胜感激。
PS:不。SQL Jobs 不是一个选项,因为看门狗应该是实时的 :-) 集成服务?有没有更简单的方法来实现这样的服务?
亲切的问候,萨尼
就像我的标题所描述的那样:我如何在 SQL Server 2008 中实现类似看门狗服务的功能,并执行以下任务:当在该表上提交太多插入时发出警报或执行操作。
例如:错误表在正常情况下在一秒钟内收到 10 条错误消息。如果在一秒钟内超过 100 条错误消息(100 条插入),则:ALERT!
如果您能帮助我,将不胜感激。
PS:不。SQL Jobs 不是一个选项,因为看门狗应该是实时的 :-) 集成服务?有没有更简单的方法来实现这样的服务?
亲切的问候,萨尼
我不完全理解你的问题,所以我不完全确定我的答案是否真的解决了任何问题,或者只是让潜在的问题变得更糟。尤其是当您面临性能或并发问题时,这可能行不通。
如果您可以更新原始表,只需添加一个 datetime2 字段,如
InsertDate datetime2 NOT NULL DEFAULT GETDATE()
最好在表上创建一个索引,然后以任何适合的间隔,通过查看有多少行具有 InsertDate > GetDate - X 来轮询表。
对于这种特殊情况,您可能会受益于将轮询过程读取为未提交(或使用WITH NOLOCK
),尽管这样做时必须小心。
如果您无法修改表本身,并且您不能或不会让另一个流程或作业监控相关变量,我建议您执行以下操作:
在原始表上,创建一个 AFTER INSERT 触发器:
如果您可以修改原始表,请将 datetime 列添加到该表中,并使触发器对所有尚未 X 秒旧的行进行计数,并在必要时采取行动。
我还会考虑让另一个进程(即 SQL 作业或自制服务或类似服务)来完成所有的内务管理,即。删除旧行,计算行数并对其进行操作。将其保留为触发器的工作不是一个好的设计,从长远来看可能会导致问题。
如果可能的话,您应该考虑让其他进程来进行内务处理。
更新:更好的解决方案可能是将触发器插入通知(即日期时间)到队列中 - 如果您随后有一些东西正在监听该队列,您可以编写逻辑来确定您的阈值是否已超过。但是,这将需要您将一些逻辑转移到另一个流程中,我最初认为这不是一种选择。