Gestione delle identità di Service Broker

Ogni database contiene un identificatore univoco utilizzato per il routing dei messaggi di Service Broker verso il database. In questo argomento vengono descritti gli identificatori di Service Broker, le opzioni di protezione di Service Broker dall'indirizzamento errato dei messaggi e le opzioni disponibili per la gestione degli identificatori di Service Broker.

Identificatori di Service Broker

Ogni database contiene un identificatore di Service Broker che lo distingue da tutti gli altri database nella rete. Nella colonna service_broker_guid della vista del catalogo sys.databases è riportato l'identificatore di Service Broker per ogni database nell'istanza. I sistemi Service Broker possono essere progettati per eseguire più copie di un servizio. Ogni copia del servizio viene eseguita in un database distinto. In un sistema con più copie di un servizio, utilizzare la clausola BROKER_INSTANCE dell'istruzione CREATE ROUTE per creare una route a una copia specifica del servizio.

Il routing di Service Broker utilizza l'identificatore di Service Broker per garantire il recapito di tutti i messaggi di una conversazione allo stesso database. L'istruzione BEGIN DIALOG CONVERSATION apre una conversazione con un servizio di destinazione. Se una conversazione viene aperta correttamente, il messaggio di acknowledgment del servizio di destinazione contiene l'identificatore di Service Broker per il database di destinazione. Quindi Service Broker esegue il routing tutti i messaggi per la conversazione verso il database specificato.

Gli identificatori di Service Broker possono essere specificati nella clausola TO SERVICE dell'istruzione BEGIN DIALOG CONVERSATION per controllare il tipo di routing da eseguire:

  • Per eseguire il routing delle conversazioni verso una copia specifica di un servizio, specificare service_broker_guid. Ad esempio, è possibile che si disponga di tre copie di un servizio in tre database sulla rete: un database di sviluppo, un database di test e un database di produzione. Le istruzioni BEGIN DIALOG CONVERSATION in ogni sistema devono specificare service_broker_guid per assicurare che tutti i messaggi vadano al database corretto.

  • Per consentire a Service Broker di bilanciare il carico delle conversazioni tra più copie di un servizio, non specificare service_broker_guid. In alternativa, Service Broker seleziona una delle route con lo stesso nome di servizio specificato nella clausola TO SERVICE di BEGIN DIALOG CONVERSATION.

Per impostazione predefinita, se è disponibile una sola copia di un servizio in una rete, Service Broker esegue correttamente il routing delle conversazioni. Non è necessario specificare l'identificatore di Service Broker nelle istruzioni CREATE ROUTE o BEGIN DIALOG CONVERSATION.

Per ulteriori informazioni sulla corrispondenza di route in Service Broker, vedere Routing di Service Broker.

Per supportare correttamente il recapito dei messaggi, ogni identificatore di Service Broker deve essere univoco tra tutte le istanze del Motore di database nella stessa rete. In caso contrario, può verificarsi un indirizzamento errato dei messaggi. Ai nuovi database creati viene assegnato un nuovo identificatore di Service Broker che deve essere univoco nella rete. Quando il database viene ripristinato o collegato, l'identificatore viene ripristinato. Prestare attenzione con il ripristino e la connessione di database. Evitare che più database eseguano in modo attivo le operazioni di Service Broker e utilizzino gli stessi identificatori.

Recapito dei messaggi di Service Broker

In SQL Server è disponibile un meccanismo per la disattivazione del recapito dei messaggi di Service Broker in un database, se presenta lo stesso identificatore di Service Broker di un altro database nella stessa rete. Tutti i messaggi inviati dal database per il quale il recapito è disattivato rimangono nella coda di trasmissione del database. Inoltre, in Service Broker i servizi di tale database non vengono considerati disponibili per la ricezione di messaggi,. ad esempio nel caso in cui in un'istanza venga individuato un servizio di destinazione dal routing di Service Broker.

La disattivazione del recapito dei messaggi di Service Broker consente la connessione sicura di un backup di un database per la risoluzione di problemi o il recupero dei dati, evitando il rischio di un indirizzamento errato dei messaggi. Nella colonna is_broker_enabled della vista del catalogo sys.databases è riportato lo stato corrente del recapito dei messaggi di Service Broker per ogni database.

Quando si connette o si ripristina un database, verificare con attenzione che il recapito dei messaggi sia attivo per un unico database con un determinato identificatore di Service Broker. In caso contrario, può verificarsi un indirizzamento errato dei messaggi, con conseguente elaborazione della conversazione in una copia del database non corretta.

Gestione degli identificatori e del recapito dei messaggi

I comandi CREATE DATABASE, ALTER DATABASE e RESTORE DATABASE contengono le opzioni per attivare il recapito dei messaggi di Service Broker, nonché le opzioni per modificare l'identificatore di Service Broker per un database.

Per impostazione predefinita, quando si connette o si ripristina un database, l'identificatore e lo stato di recapito dei messaggi di Service Broker rimangono invariati. In genere, l'identificatore di Service Broker non viene modificato nelle situazioni seguenti:

  • Quando si ripristina un backup a scopo di recupero.

  • Quando si configura una coppia con mirroring.

  • Quando si configura il log shipping per un server di standby. Quando si esegue una copia del database, l'identificatore dell'istanza viene modificato.

Per la gestione degli identificatori e del recapito dei messaggi sono disponibili quattro opzioni:

  • ENABLE_BROKER. Questa opzione attiva il recapito dei messaggi di Service Broker mantenendo l'identificatore di Service Broker esistente per il database.

    Nota

    Per abilitare SQL Server Service Broker in un database, è necessario un blocco a livello di database. Per abilitare Service Broker nel database msdb, interrompere SQL Server Agent. A questo punto, Service Broker può ottenere il blocco necessario.

  • DISABLE_BROKER. Questa opzione disattiva il recapito dei messaggi di Service Broker mantenendo l'identificatore di Service Broker esistente per il database.

  • NEW_BROKER. Questa opzione attiva il recapito dei messaggi di Service Broker e crea un nuovo identificatore di Service Broker per il database. Questa opzione termina tutte le conversazioni esistenti nel database e restituisce un errore per ogni conversazione, perché queste conversazioni non utilizzano il nuovo identificatore. Tutte le route che fanno riferimento all'identificatore di Service Broker precedente devono essere ricreate con il nuovo identificatore.

  • ERROR_BROKER_CONVERSATIONS. Questa opzione attiva il recapito dei messaggi di Service Broker mantenendo l'identificatore di Service Broker esistente per il database. Service Broker termina tutte le conversazioni nel database e restituisce un errore per ogni conversazione. Questa opzione viene in genere utilizzata quando è necessario ripristinare un database in un momento diverso rispetto agli altri database con cui presenta conversazioni aperte. Tutte le conversazioni nel database ripristinato devono essere terminate con un errore, perché non sono più sincronizzate con gli altri database. L'identificatore di Service Broker viene mantenuto in modo che tutte le route che vi fanno riferimento siano ancora valide.

Indipendentemente dall'opzione specificata, SQL Server non consente l'attivazione del recapito dei messaggi nella stessa istanza di SQL Server per due database con lo stesso identificatore di Service Broker. Se si connette un database con lo stesso identificatore di Service Broker di un database esistente, SQL Server disattiva il recapito dei messaggi di Service Broker nel database collegato.

Per ulteriori informazioni sulle opzioni per la connessione di database, vedere CREATE DATABASE (Transact-SQL) e ALTER DATABASE (Transact-SQL). Per informazioni sull'attivazione del recapito dei messaggi di Service Broker in un database, vedere Procedura: Attivazione del recapito dei messaggi di Service Broker nei database (Transact-SQL).