卸载 Service Broker 应用程序

适用于:SQL ServerAzure SQL 托管实例

您只能在数据库的宿主实例不变,但是不再提供 Service Broker 应用程序所实现的服务时卸载该应用程序。 删除数据库将删除该数据库中的 Service Broker 对象。 将数据库从一个实例移到另一个实例的同时还会移走该数据库所承载的服务。

卸载起始服务

若要卸载起始服务,先使应用程序停止创建传出的消息。 阻止应用程序发送新消息的最佳方法取决于应用程序的类型。 对于使用存储过程发起会话的应用程序,可能需要删除该存储过程。 对于外部程序,可能需要使用户不能使用它,或卸载该程序。

使服务停止创建新消息后,请确保该服务处理队列中留下的每个消息。 您可以编写一个简单的过程,它接收队列中的每个消息,结束会话同时返回一个错误,然后删除该会话的状态。 处理队列中的所有消息可以使目标应用程序正常地结束会话,而不必等待来自您要关闭的服务的响应。

最后,删除服务定义以确保 Service Broker 不再接受该服务的消息。 删除该服务的所有路由。 删除服务的约定、消息类型和队列,除非实例中的其他服务也要使用这些对象。 必要时删除服务的激活存储过程。

卸载目标服务

若要卸载目标服务,先确保该服务处理队列中留下的每个消息。 您可以让应用程序处理消息,或者编写一个以应用程序特定错误结束会话的简单过程,还可以仅删除该服务以便以 Service Broker 错误结束会话。 无论选择哪一种方法,结束会话可使起始应用程序正常结束,而不必等待来自您要关闭的服务的响应。

在承载起始服务的数据库中,如果某个路由包含要卸载的服务的网络地址,则删除它。 在转发此服务中消息的实例的 msdb 数据库中,删除此服务的路由。 如果托管该服务的实例在 msdb 中包含该服务的路由,请删除该路由。

最后,删除服务定义以确保 Service Broker 不再接受该服务的消息。 删除服务的约定、消息类型和队列,除非实例中的其他服务也要使用这些对象。 必要时删除服务的激活存储过程。

另请参阅