对于分布式数据库,我们选择了Service Broker进行数据同步,数据格式为well_formed_xml,实现方式是在A数据对应表中写触发器,当添加或修改时用FOR XML RAW,TYPE生成XML文档并发送消息,B数据库接收并处理消息。但目前发现一个问题:
当生成的XML文档(即消息的内容)中不特殊字符时,Broker运行正常;但如果包含了特殊字符(!@#$%^^&*()_+中的部分或全部,没有一个个验证),在接收数据库端可检测到"Queue disabled"的提示(估计这就是所谓的“有害消息”),接着就是队列中止。必须删除该消息才能从重使用Broker。请问:Broker中有害消息是如何定义的?为什么XML中包含特殊字符则不能正常接收消息?又该如何处理呢?Service Broker数据库
当生成的XML文档(即消息的内容)中不特殊字符时,Broker运行正常;但如果包含了特殊字符(!@#$%^^&*()_+中的部分或全部,没有一个个验证),在接收数据库端可检测到"Queue disabled"的提示(估计这就是所谓的“有害消息”),接着就是队列中止。必须删除该消息才能从重使用Broker。请问:Broker中有害消息是如何定义的?为什么XML中包含特殊字符则不能正常接收消息?又该如何处理呢?Service Broker数据库
参考http://blog.csdn.net/mobidogs/article/details/4127908
上图中:
update customer set Comment='SELECT TEST<aa!aaa<TEST>ersation_endpoints' where id=2142
触发了触发器生成XML语句并传送到目标数据库,目标数据库接收到的XML为:
<root>
<BASE_INFO table="Customer" primaryKey="Id" ActionField="Id,Comment" />
<DATA_INFO>
<row Id="2142" AdminComment="SELECT TEST<aa!aaa&lt;TEST&gt;ersation_endpoints" />
</DATA_INFO>
</root>
都是转义后的。
如果我将Comment语句中的“<”改为“<”,目标数据库接收到的XML与上面的还是一样的,这时却一切正常