【问题标题】:SQL Server Service Broker for monitoring DML changes用于监视 DML 更改的 SQL Server Service Broker
【发布时间】:2016-08-15 14:25:38
【问题描述】:

我想做什么:

  • 通过 C# 外部应用程序监听 X 表上的 DB 插入/更新语句

  • 我希望在每次插入/更新时收到通知

  • 收到通知后我想检索插入/更新的行

我是如何处理这个问题的:

  • 为每个表创建一个 DML 触发器,在插入/更新后更新每个表上的服务代理队列

  • 在此之后,我对方法并不完全清楚。主要是如何接收服务代理队列的通知?

据我了解,SqlDependency 需要一个查询来检测更改。因此,我是否要针对目标队列指定查询?

谢谢

【问题讨论】:

  • 您希望在队列中找到什么?更改的行的标识符列表?还是实际更改的列表?无论哪种方式,您都将对触发器隐藏消息的队列使用receive 语句。您还可以查看外部激活(将带有“服务代理”的术语放入您最喜欢的搜索引擎以获取更多详细信息)。
  • 理想情况下,我会根据需要使用 XML 格式的实际更改。关于外部激活,我的理解是它每次都会激活 exe 文件(当然我可能错了),理想情况下,我希望与 db 实例保持恒定连接并在每个 DML 触发器时得到通知。因此要澄清我应该在哪里使用 Receive 语句?是否应该在 SqlDependency 查询中定义?

标签: c# sql-server service-broker


【解决方案1】:

SqlDependency 是一种抽象,恰好在后台使用 Service Broker 来传递通知。在这种情况下,我认为您可以忽略它(它是SqlDependency)

我实际上已经实现了一个类似的系统(在代理中排队更改)。大致的笔画是:

  1. 为要捕获的更改类型(任何插入/更新/删除)创建触发器。触发器将制作 XML 消息并将其发送到 Service Broker 队列。
  2. 使用类似receive top(1000) cast(message_body as xml) from yourQueue 的方式使用这些消息。确保您阅读了此处的最佳实践(如毒消息处理等)。您可以将所有内容包装在一个存储过程中并让您的应用程序调用它。

此外,如果您要避免激活,您可能会在某个时间间隔进行轮询,很可能当您的应用程序进行轮询时,您会想要获取所有消息(或者至少被通知有更多)。所以你会想要在循环中执行receive 语句,或者做一些聪明的事情,比如“哦……我最多要求 1000,我得到了 1000。可能还有更多!”所以你知道立即回去处理排队的消息。如果您希望我详细说明这些,请告诉我。

【讨论】:

    猜你喜欢
    • 2010-11-21
    • 2013-09-07
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多