我第一次设置了服务代理并对其进行了测试……看起来不错。每次在特定表上发生 DML 操作时;假设价格表,一个触发器调用一个存储过程,将插入和删除的表作为 XML 参数传递给它,这会将消息(包含 2 个 XML)发送到队列。
激活过程然后处理队列,并将对初始表所做的更改插入到审计表中......效果很好。
当价格表上的更新量很大时,就会出现问题。就我而言,我测试了 105 000 件商品的价格变化更新。XML Inserted 和 Deleted 变量,每个包含 130 万行......这会导致主要问题:TempDB 无限增长,处理器上升到 95%,这是可以理解的......但似乎从未完成操作。
触发器的代码是Price_TAB_Audit_trig。触发器调用SendMsgServiceBroker过程将消息发送到队列。有关激活过程,请参阅下面的评论。
我试图弄清楚如何将插入和删除的变量(消息)分解成更小的 XML。我的问题/想法是:我可以创建表变量并将其传递到消息而不是 XML 中吗?如果是这样,如何在触发器中创建变量表?我应该创建全局唯一临时表并在消息中引用它们吗?
任何其他建议,欢迎。提前谢谢你
您可以使用以下设置中的触发器之类的东西以预定义的块发送 xml 数据。
在 tempdb 中创建测试平台:
触发:
插入一些测试数据以查看触发器的作用:
显示结果:
通过使用表值参数将详细信息传递到存储过程的示例,请看一下:
清理测试台对象(如果它们已经存在):
创建测试台对象:
测试触发器/存储过程:
查看目标表中的内容:
如果空间很宝贵,并且您决定更新大量行,这可能仍然会带来相当大的问题,因为 SQL Server 需要在表变量中为
inserted
和中存在的所有数据分配空间deleted
。然而,至少从代码可读性的角度来看,这是解决问题的一种优雅方式。