Compartir a través de


CREATE ROUTE (Transact-SQL)

Agrega una ruta nueva a la tabla de enrutamiento para la base de datos actual. Para los mensajes salientes, Service Broker determina el enrutamiento mediante la comprobación de la tabla de enrutamiento en la base de datos local. Para los mensajes de las conversaciones que se originan en otra instancia, incluidos los mensajes que se van a reenviar, Service Broker comprueba las rutas en msdb.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

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' ]
[ ; ]

Argumentos

  • route_name
    Es el nombre de la ruta que se va a crear. Se crea una ruta nueva en la base de datos actual, la cual pertenece a la entidad de seguridad especificada en la cláusula AUTHORIZATION. No se pueden especificar nombres de servidor, base de datos o esquema. route_name debe ser un tipo sysname válido.

  • AUTHORIZATION owner_name
    Establece el propietario de la ruta en el usuario o función de la base de datos que se ha especificado. owner_name puede ser el nombre de cualquier usuario o función válidos si el usuario actual es un miembro de la función fija de base de datos db_owner o de la función fija de servidor sysadmin. En caso contrario, owner_name debe ser el nombre del usuario actual, el nombre de un usuario para el que el usuario actual tiene permiso IMPERSONATE o el nombre de una función a la que pertenece el usuario actual. Si se omite esta cláusula, la ruta pertenece al usuario actual.

  • WITH
    Presenta las cláusulas que definen la ruta creada.

  • SERVICE_NAME = 'service_name'
    Especifica el nombre del servicio remoto señalado por esta ruta. service_name debe coincidir exactamente con el nombre que utiliza el servicio remoto. Service Broker utiliza una comparación byte por byte para service_name. En otras palabras, en la comparación se distinguen mayúsculas y minúsculas, y no se considera la intercalación actual. Si se omite SERVICE_NAME, esta ruta coincide con todos los nombres de servicio, pero tiene una prioridad inferior de coincidencia con respecto a una ruta que especifique SERVICE_NAME. Una ruta con el nombre de servicio 'SQL/ServiceBroker/BrokerConfiguration' es una ruta a un servicio de notificación de configuración del broker. Es posible que una ruta a este servicio no especifique una instancia de broker.

  • BROKER_INSTANCE = 'broker_instance_identifier'
    Especifica la base de datos que aloja el servicio de destino. El parámetro broker_instance_identifier debe ser el identificador de la instancia de broker para la base de datos remota, que se puede obtener al ejecutar la siguiente consulta en la base de datos seleccionada:

    SELECT service_broker_guid
    FROM sys.databases
    WHERE database_id = DB_ID()
    

    Si se omite la cláusula BROKER_INSTANCE, esta ruta coincide con todas las instancias de broker. Una ruta que coincida con todas las instancias de broker tiene una prioridad superior de coincidencia con respecto a las rutas con una instancia de broker explícita si la conversación no especifica una instancia de broker. Para las conversaciones que especifican una instancia de broker, una ruta con una instancia de broker tiene una prioridad superior a la de una ruta que coincida con todas las instancias de broker.

  • LIFETIME **=**route_lifetime
    Especifica el tiempo, en segundos, durante el que SQL Server retiene la ruta en la tabla de enrutamiento. Transcurrido este tiempo, la ruta caduca y SQL Server ya no la tiene en cuenta al elegir una ruta para una conversación nueva. Si se omite esta cláusula, route_lifetime es NULL y la ruta no caduca nunca.

  • ADDRESS ='next_hop_address'
    Especifica la dirección de red para esta ruta. next_hop_address especifica una dirección TCP/IP en el siguiente formato:

        TCP://{ nombreDNS | nombreNetBIOS | direcciónIP } : númeroDePuerto.

    El númeroDePuerto especificado debe coincidir con el número de puerto del extremo de Service Broker de una instancia de SQL Server en el equipo especificado. Se puede obtener ejecutando la consulta siguiente en la base de datos seleccionada:

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

    Si el servicio se aloja en una base de datos reflejada, debe especificar también MIRROR_ADDRESS para la otra instancia que aloja una base de datos reflejada. En caso contrario, esta ruta no realiza la conmutación por error al reflejo.

    Si una ruta especifica 'LOCAL' para next_hop_address, el mensaje se entrega a un servicio en la instancia actual de SQL Server.

    Si una ruta especifica 'TRANSPORT' para next_hop_address, la dirección de red se determina en función de la dirección de red del nombre del servicio. Una ruta que especifica 'TRANSPORT' podría no especificar un nombre de servicio o instancia de broker.

  • MIRROR_ADDRESS ='next_hop_mirror_address'
    Especifica la dirección de red de una base de datos reflejada con una base de datos reflejada alojada en next_hop_address. next_hop_mirror_address especifica una dirección TCP/IP en el siguiente formato:

    TCP://{ nombreDNS | nombreNetBIOS | direcciónIP } : númeroDePuerto

    El númeroDePuerto especificado debe coincidir con el número de puerto del extremo de Service Broker de una instancia de SQL Server en el equipo especificado. Se puede obtener ejecutando la consulta siguiente en la base de datos seleccionada:

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

    Si se especifica MIRROR_ADDRESS, la ruta debe especificar la cláusula SERVICE_NAME y la cláusula BROKER_INSTANCE. Una ruta que especifica 'LOCAL' o 'TRANSPORT' para next_hop_address podría no especificar una dirección de reflejo.

Notas

La tabla de enrutamiento que almacena las rutas es una tabla de metadatos que se puede leer mediante la vista de catálogo sys.routes. Esta vista de catálogo sólo se puede actualizar mediante las instrucciones CREATE ROUTE, ALTER ROUTE y DROP ROUTE.

De forma predeterminada, la tabla de enrutamiento de cada base de datos de usuario contiene una ruta. Esta ruta se llama AutoCreatedLocal. La ruta especifica 'LOCAL' para next_hop_address y coincide con todos los nombres de servicio e identificadores de instancia de broker.

Si una ruta especifica 'TRANSPORT' para next_hop_address, la dirección de red se determina en función del nombre del servicio. SQL Server puede procesar de forma correcta nombres de servicio que comienzan con una dirección de red en un formato válido para next_hop_address.

La tabla de enrutamiento puede contener un número indeterminado de rutas que especifican el mismo servicio, dirección de red e identificador de instancia de broker. En este caso, Service Broker elige una ruta mediante un procedimiento diseñado para buscar la coincidencia más exacta entre la información especificada en la conversación y la información de la tabla de enrutamiento. Para obtener más información sobre cómo Service Broker elige una ruta, vea Enrutamiento de Service Broker.

Service Broker no quita las rutas caducadas de la tabla de enrutamiento. Se puede activar una ruta caducada mediante la instrucción ALTER ROUTE.

Una ruta no puede ser un objeto temporal. Se permiten los nombres de ruta que empiezan por #, pero se trata de objetos permanentes.

Permisos

De forma predeterminada, tienen permiso para crear una ruta los miembros de las funciones fijas de base de datos db_ddladmin o db_owner y la función fija de servidor sysadmin.

Ejemplos

A. Crear una ruta TCP/IP con un nombre DNS

En el ejemplo siguiente se crea una ruta al servicio //Adventure-Works.com/Expenses. La ruta especifica que los mensajes para este servicio se desplazan por TCP hasta el puerto 1234 del host identificado mediante el nombre DNS www.Adventure-Works.com. Al llegar los mensajes, el servidor de destino los entrega a la instancia de broker indicada mediante el identificador único D8D4D268-00A3-4C62-8F91-634B89C1E315.

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. Crear una ruta TCP/IP con un nombre NetBIOS

En el ejemplo siguiente se crea una ruta al servicio //Adventure-Works.com/Expenses. La ruta especifica que los mensajes para este servicio se desplazan por TCP hasta el puerto 1234 del host identificado mediante el nombre NetBIOS SERVER02. Cuando llega el mensaje, la sesión de destino de SQL Server lo entrega a la instancia de base de datos indicada por el identificador único 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. Crear una ruta TCP/IP con una dirección IP

En el ejemplo siguiente se crea una ruta al servicio //Adventure-Works.com/Expenses. La ruta especifica que los mensajes para este servicio se desplazan por TCP hasta el puerto 1234 del host en la dirección IP 192.168.10.2. Cuando llega el mensaje, la sesión de destino de SQL Server lo entrega a la instancia de broker indicada por el identificador único D8D4D268-00A3-4C62-8F91-634B89C1E315.

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. Crear una ruta a un broker de reenvío

En el ejemplo siguiente se crea una ruta al broker de reenvío en el servidor dispatch.Adventure-Works.com. Dado que no se especifican el nombre de servicio ni el identificador de la instancia de broker, SQL Server utiliza esta ruta para los servicios que no tienen ninguna otra ruta definida. Para obtener más información sobre el enrutamiento, vea Enrutamiento de Service Broker.

CREATE ROUTE ExpenseRoute
    WITH
    ADDRESS = 'TCP://dispatch.Adventure-Works.com' ; 

E. Crear una ruta a un servicio local

En el ejemplo siguiente se crea una ruta al servicio //Adventure-Works.com/LogRequests en la misma instancia que la ruta.

CREATE ROUTE LogRequests
    WITH
    SERVICE_NAME = '//Adventure-Works.com/LogRequests',
    ADDRESS = 'LOCAL' ;

F. Crear una ruta con una vigencia específica

En el ejemplo siguiente se crea una ruta al servicio //Adventure-Works.com/Expenses. La vigencia de la ruta es 259200 segundos, lo que equivale a 72 horas.

CREATE ROUTE ExpenseRoute
    WITH
    SERVICE_NAME = '//Adventure-Works.com/Expenses',
    LIFETIME = 259200,
    ADDRESS = 'TCP://services.Adventure-Works.com:1234' ;

G. Crear una ruta a una base de datos reflejada

En el ejemplo siguiente se crea una ruta al servicio //Adventure-Works.com/Expenses. El servicio se aloja en una base de datos reflejada. Una de las bases de datos reflejadas se encuentra en la dirección services.Adventure-Works.com:1234 y la otra en la dirección 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. Crear una ruta que utiliza el nombre de servicio para el enrutamiento

En el siguiente ejemplo se crea una ruta que utiliza el nombre del servicio para determinar la dirección de red a la que se va a enviar el mensaje. Tenga en cuenta que una ruta que especifica 'TRANSPORT' como dirección de red tiene una prioridad inferior de coincidencia con respecto al resto de las rutas.

CREATE ROUTE TransportRoute
    WITH ADDRESS = 'TRANSPORT' ;