CREATE ROUTE (Transact-SQL)
在当前数据库的路由表中添加一个新路由。 对于外发消息,Service Broker 通过检查本地数据库中的路由表来确定路由。 对于在另一个实例中发起的会话的消息(包括要转发的消息),Service Broker 将在 msdb 中检查路由。
语法
CREATE ROUTE route_name
[ AUTHORIZATION owner_name ]
WITH
[ SERVICE_NAME = 'service_name', ]
[ BROKER_INSTANCE = 'broker_instance_identifier' , ]
[ LIFETIME = route_lifetime , ]
ADDRESS = 'next_hop_address'
[ , MIRROR_ADDRESS = 'next_hop_mirror_address' ]
[ ; ]
参数
route_name
要创建的路由的名称。 新路由在当前数据库中创建,并归 AUTHORIZATION 子句中指定的主体数据库所有。 不能指定服务器、数据库和架构名称。 route_name 必须是有效的 sysname。AUTHORIZATION owner_name
将路由所有者设置为指定的数据库用户或角色。 如果当前用户为 db_owner 固定数据库角色或 sysadmin 固定服务器角色的成员,则 owner_name 可以为任意有效用户或角色的名称。 否则,owner_name 必须是当前用户的名称,或者是当前用户对其有 IMPERSONATE 权限的用户的名称,或者是当前用户所属的角色的名称。 如果省略此子句,则路由属于当前用户。WITH
介绍用于定义要创建的路由的子句。SERVICE_NAME = 'service_name'
指定此路由指向的远程服务的名称。 service_name 必须与远程服务使用的名称完全匹配。 Service Broker 将进行逐字节比较来匹配 service_name。 也就是说,这种比较区分大小写,并且不考虑当前的排序规则。 如果省略 SERVICE_NAME,则此路由将与任何服务名称匹配,但比指定 SERVICE_NAME 的路由的匹配优先级低。 服务名称为 'SQL/ServiceBroker/BrokerConfiguration' 的路由是指向 Broker Configuration Notice 服务的路由。 指向此服务的路由不能指定 Broker 实例。BROKER_INSTANCE = 'broker_instance_identifier'
指定承载目标服务的数据库。 broker_instance_identifier 参数必须是远程数据库的 Broker 实例标识符,该标识符可以通过在所选数据库中运行以下查询获得:SELECT service_broker_guid FROM sys.databases WHERE database_id = DB_ID()
如果省略 BROKER_INSTANCE 子句,则此路由将与任何 Broker 实例匹配。 如果会话没有指定 Broker 实例,则匹配任何 Broker 实例的路由的匹配优先级高于具有显式 Broker 实例的路由的匹配优先级。 对于指定了 Broker 实例的会话,具有 Broker 实例的路由的优先级高于匹配任何 Broker 实例的路由的优先级。
LIFETIME **=**route_lifetime
指定 SQL Server 在路由表中保留路由的时间(秒)。 在生存期结束后,相应的路由即过期,SQL Server 在为新会话选择路由时将不再考虑该路由。 如果省略此子句,则 route_lifetime 为 NULL,并且路由始终不过期。ADDRESS ='next_hop_address'
指定此路由的网络地址。 next_hop_address 按以下格式指定 TCP/IP 地址:TCP://{ dns_name | netbios_name | ip_address } : port_number
指定的 port_number 必须与指定计算机上 SQL Server 实例的 Service Broker 端点的端口号匹配。 这可以通过在选定数据库中运行如下查询获得:
SELECT tcpe.port FROM sys.tcp_endpoints AS tcpe INNER JOIN sys.service_broker_endpoints AS ssbe ON ssbe.endpoint_id = tcpe.endpoint_id WHERE ssbe.name = N'MyServiceBrokerEndpoint';
如果服务驻留在镜像数据库中,那么,还必须为驻留镜像数据库的其他实例指定 MIRROR_ADDRESS。 否则,此路由不会故障转移到此镜像。
当路由为 next_hop_address 指定 'LOCAL' 时,消息将传递给当前 SQL Server 实例中的服务。
当路由为 next_hop_address 指定 'TRANSPORT' 时,根据服务名称中的网络地址确定网络地址。 指定了 'TRANSPORT' 的路由不能指定服务名称或 Broker 实例。
MIRROR_ADDRESS ='next_hop_mirror_address'
指定有一个镜像数据库驻留在 next_hop_address 的镜像数据库的网络地址。 next_hop_mirror_address 按以下格式指定 TCP/IP 地址:TCP://{ dns_name | netbios_name | ip_address } : port_number
指定的 port_number 必须与指定计算机上 SQL Server 实例的 Service Broker 端点的端口号匹配。 这可以通过在选定数据库中运行如下查询获得:
SELECT tcpe.port FROM sys.tcp_endpoints AS tcpe INNER JOIN sys.service_broker_endpoints AS ssbe ON ssbe.endpoint_id = tcpe.endpoint_id WHERE ssbe.name = N'MyServiceBrokerEndpoint';
如果指定了 MIRROR_ADDRESS,则路由必须指定 SERVICE_NAME 子句和 BROKER_INSTANCE 子句。 为 next_hop_address 指定 'LOCAL' 或 'TRANSPORT' 的路由不能指定镜像地址。
注释
存储路由的路由表是一个元数据表,可通过 sys.routes 目录视图读取。 此目录视图只能通过 CREATE ROUTE、ALTER ROUTE 和 DROP ROUTE 语句进行更新。
默认情况下,每个用户数据库中的路由表包含一个路由。 此路由的名称为 AutoCreatedLocal。 此路由为 next_hop_address 指定 'LOCAL',并匹配任何服务名称和 Broker 实例标识符。
当路由为 next_hop_address 指定 'TRANSPORT' 时,将根据服务名称确定网络地址。 对于以网络地址开头的服务名称,只要网络地址的格式对 next_hop_address 有效,SQL Server 就可以成功地处理。
路由表可以包含任意数目的指定相同服务、网络地址和 Broker 实例标识符的路由。 在此情况下,Service Broker 会使用专门的过程,在会话中指定的信息与路由表中的信息之间找出最匹配的项,以此来选择路由。
Service Broker 不会从路由表中删除过期路由。 可以使用 ALTER ROUTE 语句激活过期路由。
路由不能是临时对象。 允许路由名称以 # 开头,但仅限于永久对象。
权限
默认情况下,db_ddladmin 或 db_owner 固定数据库角色和 sysadmin 固定服务器角色的成员拥有创建路由的权限。
示例
A.使用 DNS 名称创建 TCP/IP 路由
下面的示例创建一个指向服务 //Adventure-Works.com/Expenses 的路由。 此路由指定到此服务的消息需要通过 TCP 传输到由 DNS 名称 www.Adventure-Works.com 标识的主机上的端口 1234。 目标服务器将到达的消息传递到由唯一标识符 D8D4D268-00A3-4C62-8F91-634B89C1E315 标识的 Broker 实例。
CREATE ROUTE ExpenseRoute
WITH
SERVICE_NAME = '//Adventure-Works.com/Expenses',
BROKER_INSTANCE = 'D8D4D268-00A3-4C62-8F91-634B89C1E315',
ADDRESS = 'TCP://www.Adventure-Works.com:1234' ;
B.使用 NetBIOS 名称创建 TCP/IP 路由
下面的示例创建一个指向服务 //Adventure-Works.com/Expenses 的路由。 此路由指定到此服务的消息需要通过 TCP 传输到由 NetBIOS 名称 SERVER02 标识的主机上的端口 1234。 目标 SQL Server 将到达的消息传递到由唯一标识符 D8D4D268-00A3-4C62-8F91-634B89C1E315 标识的数据库实例。
CREATE ROUTE ExpenseRoute
WITH
SERVICE_NAME = '//Adventure-Works.com/Expenses',
BROKER_INSTANCE = 'D8D4D268-00A3-4C62-8F91-634B89C1E315',
ADDRESS = 'TCP://SERVER02:1234' ;
C.使用 IP 地址创建 TCP/IP 路由
下面的示例创建一个指向服务 //Adventure-Works.com/Expenses 的路由。 此路由指定到此服务的消息通过 TCP 传输到 IP 地址为 192.168.10.2 的主机上的端口 1234。 目标 SQL Server 将到达的消息传递到由唯一标识符 D8D4D268-00A3-4C62-8F91-634B89C1E315 标识的 Broker 实例。
CREATE ROUTE ExpenseRoute
WITH
SERVICE_NAME = '//Adventure-Works.com/Expenses',
BROKER_INSTANCE = 'D8D4D268-00A3-4C62-8F91-634B89C1E315',
ADDRESS = 'TCP://192.168.10.2:1234' ;
D.创建到转发中介器的路由
下面的示例创建到服务器 dispatch.Adventure-Works.com 中的转发中介器的路由。 由于服务名称和 Broker 实例标识符都没有指定,因此 SQL Server 将该路由用于没有未其他路由的服务。
CREATE ROUTE ExpenseRoute
WITH
ADDRESS = 'TCP://dispatch.Adventure-Works.com' ;
E.创建到本地服务的路由
下面的示例创建到路由所在实例中的服务 //Adventure-Works.com/LogRequests 的路由。
CREATE ROUTE LogRequests
WITH
SERVICE_NAME = '//Adventure-Works.com/LogRequests',
ADDRESS = 'LOCAL' ;
F.创建具有指定生存期的路由
下面的示例创建一个指向服务 //Adventure-Works.com/Expenses 的路由。 路由的生存期是 259200 秒,即 72 小时。
CREATE ROUTE ExpenseRoute
WITH
SERVICE_NAME = '//Adventure-Works.com/Expenses',
LIFETIME = 259200,
ADDRESS = 'TCP://services.Adventure-Works.com:1234' ;
G.创建到镜像数据库的路由
下面的示例创建一个指向服务 //Adventure-Works.com/Expenses 的路由。 该服务驻留在被镜像的数据库中。 其中一个镜像数据库位于地址 services.Adventure-Works.com:1234,另一个数据库位于地址 services-mirror.Adventure-Works.com:1234。
CREATE ROUTE ExpenseRoute
WITH
SERVICE_NAME = '//Adventure-Works.com/Expenses',
BROKER_INSTANCE = '69fcc80c-2239-4700-8437-1001ecddf933',
ADDRESS = 'TCP://services.Adventure-Works.com:1234',
MIRROR_ADDRESS = 'TCP://services-mirror.Adventure-Works.com:1234' ;
H.创建使用服务名称进行路由的路由
下面的示例创建一个路由,此路由使用服务名称来确定要向其发送消息的网络地址。 请注意,指定 'TRANSPORT' 作为网络地址的路由比其他路由的匹配优先级低。
CREATE ROUTE TransportRoute
WITH ADDRESS = 'TRANSPORT' ;