创建SQL Broker对象前预检查对象是否存在的方法
SQL Server Service Broker 对象创建前存在性检查方案
Service Broker 的各类对象都有对应的系统目录视图存储元数据,直接通过视图判断存在性即可实现「存在则跳过创建」的逻辑,不需要依赖特殊语法。
核心对应系统视图
- 消息类型(Message Type):对应
sys.service_message_types - 约定(Contract):对应
sys.service_contracts - 后续如果需要创建队列、服务,可分别用
sys.service_queues、sys.services做同类判断
可直接执行的实现代码
-- 1. 检查并创建目标消息类型 IF NOT EXISTS ( SELECT 1 FROM sys.service_message_types WHERE name = N'MessageType' AND schema_id = SCHEMA_ID('dbo') -- 匹配所属架构,避免和系统内置对象、其他架构同名对象冲突 ) BEGIN CREATE MESSAGE TYPE dbo.MessageType AUTHORIZATION dbo VALIDATION = NONE; END GO -- 2. 检查并创建目标约定 IF NOT EXISTS ( SELECT 1 FROM sys.service_contracts WHERE name = N'MessageContract' AND schema_id = SCHEMA_ID('dbo') ) BEGIN CREATE CONTRACT dbo.MessageContract (dbo.MessageType SENT BY ANY); END GO
注意事项
- 必须加上schema匹配条件:SQL Server内置了大量系统级Service Broker对象,不加schema筛选很容易误匹配到系统对象,导致自定义对象创建被跳过
- 跨库部署时,需要给系统视图加上库名前缀,例如
[你的业务库名].sys.service_message_types - 判断逻辑中给对象名加
N前缀是为了兼容Unicode命名,避免特殊字符对象名匹配失败
内容的提问来源于stack exchange,提问作者André IT
相关产品推荐
相关产品推荐

