【问题标题】:Best way to get an alert soon after data inserted into a SQL Server table将数据插入 SQL Server 表后立即获得警报的最佳方法
【发布时间】:2016-09-07 00:11:16
【问题描述】:

我有一个任务,我可以控制数据库,但不能控制对 SQL Server 2008 R2 数据库执行 CRUD 操作的应用程序。

理想情况下,我想在对数据表执行插入操作后立即调用 (POST) Web API(请注意,我不必等待 API 响应)。

实现这一目标的想法

  1. 在数据表上创建一个 SQL Server 触发器(启用了 CLR,但它是 SQL Server 2008R2,因此它使用的是 .Net 2.0)。

    作为触发器的一部分,我可能必须创建一个存储过程来调用 Web API (POST)(它应该是一劳永逸,因为我不必等待 API 响应)。

  2. Service Broker 和依赖注入警报 ---> 这很好用,但我担心并发性。

  3. 传统投票

问题:如果我采用第一个解决方案,触发器是否在与插入操作相同的事务范围内执行?如果 Web API 关闭,是否会延迟插入操作?这个方法处理并发吗?

您还有其他推荐的方法吗? (请在解决方案中包括优缺点)

【问题讨论】:

  • “很快”多久了?
  • 好一个。我应该使用“实时”而不是“很快”
  • 我对第三个了解不多。至于第一个和第二个,我认为你应该同时做防御方法:创建一个 SQL 触发器来保护你的持久层;服务代理和依赖注入可保护您的 Web 应用程序层。 1 更多是 DBA 的任务,2 是软件工程师的任务。两者都很好。请注意,您不应创建存储过程 (SP),而应创建 TRIGGER,它会在 SQL Server 的 INSERT 操作之后立即执行。此触发器验证包含在同一事务中。如果出现任何错误,事务将被回滚。
  • 触发器是否在与插入操作相同的事务范围内执行?如果 Web API 出现故障,是否会延迟插入操作? YES 在两个帐户上 - 这就是您应该从不做任何繁重工作的原因之一,广泛的处理,或在触发器内调用外部服务等。

标签: c# sql-server asp.net-web-api triggers sqldependency


【解决方案1】:

触发器的问题在于它们在导致它们触发的语句的上下文和范围内执行,因此触发器的延迟会减慢/阻塞您的实际应用程序。因此,您应该切勿在触发器内进行冗长的处理或调用外部服务。

我的做法是:

  1. 有一个非常精简的触发器,只会将INSERT 放入单独的表(“命令”表或您可能称之为的任何表)中。此表应包含通知的所有必要相关信息

  2. 有一个单独的计划进程 - 计划的 SQL Server 作业或服务器上的外部应用程序 - 定期轮询该表 - 每分钟,每 15 分钟 - 无论您需要什么 - 如果“命令”表中有一个新条目,它执行它需要做的事情并发送通知或调用外部 WebAPI 服务等。

使用这种方法,您的系统仍然可以尽可能地响应(而不是“卡住”触发器造成的延迟),并且它让您可以根据需要灵活地安排“通知发送者”应用程序或 SQL 作业的频率.

【讨论】:

  • 感谢您的建议。
猜你喜欢
  • 2019-05-28
  • 2012-08-06
  • 1970-01-01
  • 2010-09-07
  • 2021-11-21
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
相关资源
最近更新 更多