对于分布式数据库,我们选择了Service Broker进行数据同步,数据格式为well_formed_xml,实现方式是在A数据对应表中写触发器,当添加或修改时用FOR XML RAW,TYPE生成XML文档并发送消息,B数据库接收并处理消息。但目前发现一个问题:
当生成的XML文档(即消息的内容)中不特殊字符时,Broker运行正常;但如果包含了特殊字符(!@#$%^^&*()_+中的部分或全部,没有一个个验证),在接收数据库端可检测到"Queue disabled"的提示(估计这就是所谓的“有害消息”),接着就是队列中止。必须删除该消息才能从重使用Broker。请问:Broker中有害消息是如何定义的?为什么XML中包含特殊字符则不能正常接收消息?又该如何处理呢?Service Broker数据库

解决方案 »

  1.   

    包含特殊字符的XML如果没有转义,XML解析就不通过,Service Broker就无法处理你需要增加转义处理,特殊字符就那些,写个转义函数就可以了
      

  2.   

    service broker 使用经验确实不多。 lz 这种情况,特殊字符应该转义 
    参考http://blog.csdn.net/mobidogs/article/details/4127908
      

  3.   

    可是在使用FOR XML RAW,TYPE生成XML文件里,已经把特殊字符转义了
    上图中:
    update customer set Comment='SELECT TEST<aa!aaa&lt;TEST&gt;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&lt;aa!aaa&amp;lt;TEST&amp;gt;ersation_endpoints" />
      </DATA_INFO>
    </root>
    都是转义后的。
    如果我将Comment语句中的“<”改为“&lt;”,目标数据库接收到的XML与上面的还是一样的,这时却一切正常