CREATE ROUTE (Transact-SQL)

在当前数据库的路由表中添加一个新路由。 对于外发消息,Service Broker 通过检查本地数据库中的路由表来确定路由。 对于在另一个实例中发起的会话的消息(包括要转发的消息),Service Broker 将在 msdb 中检查路由。

主题链接图标 Transact-SQL 语法约定

语法

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_ddladmindb_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' ;

请参阅

参考

ALTER ROUTE (Transact-SQL)

DROP ROUTE (Transact-SQL)

EVENTDATA (Transact-SQL)