Condividi tramite


CREATE ROUTE (Transact-SQL)

Aggiunge una nuova route alla tabella di routing per il database corrente. Per i messaggi in uscita, Service Broker determina il routing controllando la tabella di routing nel database locale. Per i messaggi in conversazioni che hanno origine in un'altra istanza, inclusi i messaggi da inoltrare, Service Broker controlla le route nel database msdb.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • route_name
    Nome della route da creare. La nuova route viene creata nel database corrente e diventa di proprietà dell'identità specificata nella clausola AUTHORIZATION. Non è possibile specificare i nomi del server, del database e dello schema. Il route_name deve essere un sysname valido.

  • AUTHORIZATION owner_name
    Imposta il proprietario della route sull'utente o il ruolo di database specificato. Per owner_name è possibile specificare il nome di qualsiasi utente o ruolo valido se l'utente corrente è un membro del ruolo predefinito del database db_owner o del ruolo predefinito del server sysadmin. In caso contrario, owner_name deve corrispondere al nome dell'utente corrente, al nome di un utente per il quale l'utente corrente dispone di autorizzazione IMPERSONATE oppure al nome di un ruolo a cui appartiene l'utente corrente. Se la clausola viene omessa, la route appartiene all'utente corrente.

  • WITH
    Introduce le clausole per la definizione della nuova route creata.

  • SERVICE_NAME = 'service_name'
    Specifica il nome del servizio remoto a cui punta la route. service_name deve corrispondere esattamente al nome utilizzato dal servizio remoto. Per la corrispondenza di service_name, Service Broker utilizza un confronto byte per byte. In altre parole, nel confronto viene fatta distinzione tra maiuscole e minuscole e non vengono considerate le regole di confronto correnti. Se la clausola SERVICE_NAME viene omessa, per la route viene utilizzato qualsiasi nome di servizio, ma in questo caso la route avrà una priorità di corrispondenza inferiore rispetto a una route per cui si specifica SERVICE_NAME. Una route con nome di servizio 'SQL/ServiceBroker/BrokerConfiguration' è una route per un servizio Broker Configuration Notice. Per una route per questo servizio non è necessario specificare un'istanza di Service Broker.

  • BROKER_INSTANCE = 'broker_instance_identifier'
    Specifica il database che ospita il servizio di destinazione. Il parametro broker_instance_identifier deve corrispondere all'identificatore dell'istanza di Service Broker per il database remoto. Per ottenere tale identificatore, è possibile eseguire la query seguente nel database selezionato:

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

    Se si omette la clausola BROKER_INSTANCE, per la route viene utilizzata qualsiasi istanza di Service Broker. Le route impostate per qualsiasi istanza di Service Broker hanno una priorità maggiore di corrispondenza rispetto alle route con un'istanza di Service Broker esplicita quando la conversazione non specifica un'istanza di Service Broker. Per le conversazioni che specificano un'istanza di Service Broker, invece, le route impostate per un'istanza specifica di Service Broker hanno una priorità maggiore rispetto a quelle impostate per qualsiasi istanza.

  • LIFETIME **=**route_lifetime
    Specifica per quanti secondi SQL Server mantiene la route nella tabella di routing. Al termine di questo periodo di tempo, la route scade e non viene più presa in considerazione da SQL Server per la scelta della route per una nuova conversazione. Se le clausola viene omessa, il valore route_lifetime è NULL e la route ha durata illimitata.

  • ADDRESS ='next_hop_address'
    Specifica l'indirizzo di rete per la nuova route. Il parametro next_hop_address specifica un indirizzo TCP/IP nel formato seguente:

        TCP://{ dns_name | netbios_name | ip_address } **:**port_number

    Il valore port_number specificato deve corrispondere al numero di porta dell'endpoint di Service Broker per un'istanza di SQL Server nel computer specificato. Per ottenere tale valore, eseguire la query seguente nel database selezionato:

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

    Se il servizio è ospitato in un database con mirroring, è inoltre necessario specificare l'indirizzo MIRROR_ADDRESS per l'altra istanza che ospita un database con mirroring. In caso contrario, la route non eseguirà il failover sul mirror.

    Se per il parametro next_hop_address di una route viene specificato il valore 'LOCAL', il messaggio viene recapitato a un servizio nell'istanza corrente di SQL Server.

    Se per il parametro next_hop_address di una route viene specificato il valore 'TRANSPORT', l'indirizzo di rete viene determinato in base all'indirizzo di rete nel nome del servizio. Per una route con valore 'TRANSPORT' non è necessario specificare un nome di servizio o un'istanza di Service Broker.

  • MIRROR_ADDRESS ='next_hop_mirror_address'
    Specifica l'indirizzo di rete di un database con mirroring con un database con mirroring ospitato in next_hop_address. Il parametro next_hop_mirror_address specifica un indirizzo TCP/IP nel formato seguente:

    TCP://{ dns_name | netbios_name | ip_address } : port_number

    Il valore port_number specificato deve corrispondere al numero di porta dell'endpoint di Service Broker per un'istanza di SQL Server nel computer specificato. Per ottenere tale valore, eseguire la query seguente nel database selezionato:

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

    Se si specifica MIRROR_ADDRESS, per la route è necessario specificare sia la clausola SERVICE_NAME che la clausola BROKER_INSTANCE. Per una route con valore 'LOCAL' o 'TRANSPORT' per il parametro next_hop_address non è necessario specificare un indirizzo mirror.

Osservazioni

La tabella di routing in cui sono archiviate le route è una tabella di metadati che può essere letta tramite la vista del catalogo sys.routes. È possibile aggiornare questa vista del catalogo solo tramite le istruzioni CREATE ROUTE, ALTER ROUTE e DROP ROUTE.

Per impostazione predefinita, la tabella di routing in ogni database utente contiene una sola route. Tale route è denominata AutoCreatedLocal. La route è impostata con il valore 'LOCAL' per il parametro next_hop_address e corrisponde a qualsiasi nome di servizio e identificatore di istanza di Service Broker.

Se per il parametro next_hop_address di una route viene specificato il valore 'TRANSPORT', l'indirizzo di rete viene determinato in base al nome del servizio. SQL Server è in grado di elaborare correttamente i nomi di servizi che iniziano con un indirizzo di rete in un formato valido per next_hop_address.

La tabella di routing può includere qualsiasi numero di route che specificano lo stesso servizio, indirizzo di rete e identificatore dell'istanza di Service Broker. In questo caso, Service Broker sceglie una route utilizzando una procedura progettata in modo da individuare la corrispondenza più esatta tra le informazioni specificate nella conversazione e le informazioni della tabella di routing. Per ulteriori informazioni sulla scelta di una route in Service Broker, vedere Routing di Service Broker.

Service Broker non rimuove le route scadute dalla tabella di routing. È possibile riattivare una route scaduta tramite l'istruzione ALTER ROUTE.

Una route non può essere un oggetto temporaneo. Sono consentiti nomi di route che iniziano con #, ma si tratta di oggetti permanenti.

Autorizzazioni

L'autorizzazione per la creazione di una route viene assegnata per impostazione predefinita ai membri del ruolo predefinito del database db_ddladmin o db_owner e ai membri del ruolo predefinito del server sysadmin.

Esempi

A. Creazione di una route TCP/IP utilizzando un nome DNS

Nell'esempio seguente viene creata una route per il servizio //Adventure-Works.com/Expenses. La route specifica che i messaggi per questo servizio verranno trasmessi tramite TCP alla porta 1234 nell'host identificato dal nome DNS www.Adventure-Works.com. All'arrivo, i messaggi verranno recapitati dal server di destinazione all'istanza di Service Broker identificata dall'ID univoco 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. Creazione di una route TCP/IP utilizzando un nome NetBIOS

Nell'esempio seguente viene creata una route per il servizio //Adventure-Works.com/Expenses. La route specifica che i messaggi per questo servizio verranno trasmessi tramite TCP alla porta 1234 nell'host identificato dal nome NetBIOS SERVER02. All'arrivo, il messaggio verrà recapitato dall'istanza di SQL Server di destinazione all'istanza di database identificata dall'ID univoco 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. Creazione di una route TCP/IP utilizzando un indirizzo IP

Nell'esempio seguente viene creata una route per il servizio //Adventure-Works.com/Expenses. La route specifica che i messaggi per questo servizio verranno trasmessi tramite TCP alla porta 1234 nell'host all'indirizzo IP 192.168.10.2. All'arrivo, il messaggio verrà recapitato dall'istanza di SQL Server di destinazione all'istanza di Service Broker identificata dall'ID univoco 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. Creazione di una route per un'istanza di Service Broker di inoltro

Nell'esempio seguente viene creata una route per l'istanza di Service Broker di inoltro sul server dispatch.Adventure-Works.com. Poiché non vengono specificati il nome del servizio e l'identificatore dell'istanza di Service Broker, SQL Server utilizza questa route per i servizi per cui non è definita nessun'altra route. Per ulteriori informazioni sul routing, vedere Routing di Service Broker.

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

E. Creazione di una route per un servizio locale

Nell'esempio seguente viene creata una route per il servizio //Adventure-Works.com/LogRequests nella stessa istanza della route.

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

F. Creazione di una route con una durata specifica

Nell'esempio seguente viene creata una route per il servizio //Adventure-Works.com/Expenses. La durata della route è di 259200 secondi, equivalenti a 72 ore.

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

G. Creazione di una route per un database con mirroring

Nell'esempio seguente viene creata una route per il servizio //Adventure-Works.com/Expenses. Il servizio è ospitato in un database con mirroring. Uno dei database con mirroring è disponibile all'indirizzo services.Adventure-Works.com:1234, mentre l'altro database si trova all'indirizzo 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. Creazione di una route che utilizza il nome del servizio per il routing

Nell'esempio seguente viene creata una route che utilizza il nome del servizio per determinare l'indirizzo di rete a cui inviare il messaggio. Si noti che una route con indirizzo di rete 'TRANSPORT' ha una priorità di corrispondenza inferiore rispetto alle altre route.

CREATE ROUTE TransportRoute
    WITH ADDRESS = 'TRANSPORT' ;