【问题标题】:"Real Time" data change detection in SQL ServerSQL Server 中的“实时”数据更改检测
【发布时间】:2015-07-13 17:52:55
【问题描述】:

我们需要将 SQL Server 数据库中各种表中的数据更改通知外部系统。监控哪些数据的选择在某种程度上由用户控制(可以从我们支持的列表中进行选择)。通知的接收者可能在本地连接的网络上(即在同一个数据中心),也可能是远程的。

我们目前通过数据访问层中的应用程序代码来处理此问题,该代码检测更改并将通知排队到 Service Broker 队列中,该队列由执行实际通知的 Windows 服务监控。不是很实时,但足够接近。

这已被证明存在一些维护问题,因此我们正在考虑使用 SQL Server 中内置的一种更改检测机制。不幸的是,我看过的那些(我想我都看过了)似乎都不太合适:

变更数据捕获和变更跟踪:主要问题是他们需要轮询捕获的信息以确定要传递给接收者的变更。我怀疑这会引入过多的开销。

通知服务:本质上使用 SQL Server 作为 Web 服务器,这是对许可证的可怕浪费。它还需要通过网络中至少两个防火墙进行访问,从安全角度来看这是不可接受的。

查询通知:似乎是最有可能的候选者,但似乎不太适合动态选择要观察的数据元素。每次发送通知后都需要重新注册查询,这意味着我们会让 SQL Server 忙于管理注册

事件通知:旨在通知数据库或实例级事件,并不真正适用于数据更改检测。

关于我想出的最佳想法是使用 CDC 并将插入触发器放在更改数据表上。触发器会将某些内容排队到 Service Broker 队列中,该队列将由其他代码处理以执行通知。这基本上就是我们现在所做的,只是使用 SQL Server 功能进行更改检测。我什至不确定您是否可以将触发器添加到这些表中,但我认为我会在花大量时间使用 POC 之前获得反馈。

这似乎是完成工作的一种糟糕的迂回方式。有没有我遗漏的东西可以让工作更轻松,还是我误解了这些功能之一?

谢谢,对于这个问题的冗长,我深表歉意。

【问题讨论】:

  • 您在使用 Service Broker 时遇到了哪些问题?否则我会提议……
  • 我们没有特别看到 Service Broker 的问题。这个问题的重点是如何以更清洁、更通用的方式进行变更检测。

标签: sql-server notifications


【解决方案1】:

为什么不使用更新和插入触发器?触发器可以执行clr代码,解释enter link description here

【讨论】:

  • 我已经考虑过它们,它们可能会成为最好的解决方案。它们可能是可以接受的,因为它们不会修改任何数据——只是将某些东西放在 Service Broker 队列或类似的东西上。我希望其他功能之一能够提供一些显着优势,或者至少避免“你到底为什么要使用触发器”的讨论。
  • 触发器还不错,但是像大多数事情一样,它们可能会以不好的方式使用。当触发器以不好的方式使用时,可能会导致巨大的性能问题和最奇怪的错误。但是当你正确使用它们时,它们会很有帮助。
猜你喜欢
  • 1970-01-01
  • 2012-05-12
  • 2015-06-24
  • 2014-10-29
  • 1970-01-01
  • 2011-05-17
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多