CREATE ROUTE (Transact-SQL)

Si applica a: SQL Server Istanza gestita di SQL di Azure

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 in msdb.

Convenzioni di 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. route_name deve essere un valore sysnamevalido.

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 la route fa riferimento. service_name deve corrispondere esattamente al nome usato dal servizio remoto. Service Broker usa un confronto byte per byte per trovare la corrispondenza con service_name. 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 di configurazione di Service Broker. 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 quanto tempo, in 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'
Per Istanza gestita di SQL, ADDRESS deve essere locale.

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

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

Il parametro 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 parametro 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, la route deve specificare la clausola SERVICE_NAME e 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 all'indirizzo di rete nel nome del servizio. SQL Server elabora 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 usando una procedura progettata in modo da individuare la corrispondenza più esatta tra le informazioni specificate nella conversazione e le informazioni della tabella di routing.

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

R. 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, l'istanza di SQL Server di destinazione recapita il messaggio all'istanza di database identificata dall'identificatore 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, l'istanza di SQL Server di destinazione recapita il messaggio all'istanza di broker identificata dall'identificatore 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 né il nome del servizio né l'identificatore dell'istanza di broker, SQL Server usa questa route per i servizi per cui non è definita nessun'altra route.

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

Vedere anche

ALTER ROUTE (Transact-SQL)
DROP ROUTE (Transact-SQL)
EVENTDATA (Transact-SQL)