Condividi tramite


CREATE BROKER PRIORITY (Transact-SQL)

Definisce un livello di priorità e il set di criteri da utilizzare per determinare a quali conversazioni di Service Broker deve essere assegnato il livello di priorità. Il livello di priorità è assegnato a qualsiasi endpoint di conversazione che utilizza la stessa combinazione di contratti e servizi specificati nella priorità di conversazione. Il valore delle priorità va da 1 (basso) a 10 (alto). Il valore predefinito è 5.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

CREATE BROKER PRIORITY ConversationPriorityName
FOR CONVERSATION
[ SET ( [ CONTRACT_NAME = {ContractName | ANY } ]
        [ [ , ] LOCAL_SERVICE_NAME = {LocalServiceName | ANY } ]
        [ [ , ] REMOTE_SERVICE_NAME = {'RemoteServiceName' | ANY } ]
        [ [ , ] PRIORITY_LEVEL = {PriorityValue | DEFAULT } ]
       )
]
[;]

Argomenti

  • ConversationPriorityName
    Specifica il nome per la priorità di conversazione. Il nome deve essere univoco nel database corrente e deve essere conforme alle regole per gli identificatori del Motore di database.

  • SET
    Specifica i criteri per determinare se la priorità di conversazione si applica a una conversazione. Se specificato, l'argomento SET deve contenere almeno un criterio: CONTRACT_NAME, LOCAL_SERVICE_NAME, REMOTE_SERVICE_NAME o PRIORITY_LEVEL. Se SET non è specificato, per tutti e tre i criteri vengono utilizzate le impostazioni predefinite.

  • CONTRACT_NAME = {ContractName | ANY}
    Specifica il nome di un contratto da utilizzare come criterio per determinare se la priorità di conversazione si applica a una conversazione. ContractName è un identificatore del Motore di database e deve specificare il nome di un contratto nel database corrente.

    • ContractName
      Specifica che la priorità di conversazione può essere applicata solo alle conversazioni dove l'istruzione BEGIN DIALOG che ha avviato la conversazione ha specificato il valore ON CONTRACT ContractName.

    • ANY
      Specifica che la priorità di conversazione può essere applicata a qualsiasi conversazione, indipendentemente dal contratto utilizzato.

    Il valore predefinito è ANY.

  • LOCAL_SERVICE_NAME = {LocalServiceName | ANY}
    Specifica il nome di un servizio da utilizzare come criterio per determinare se la priorità di conversazione si applica a un endpoint di conversazione.

    LocalServiceName è un identificatore del Motore di database e deve specificare il nome di un servizio nel database corrente.

    • LocalServiceName
      Specifica che la priorità di conversazione può essere applicata agli elementi seguenti:

      • Qualsiasi endpoint di conversazione dell'initiator il cui nome del servizio Initiator corrisponde a LocalServiceName.

      • Qualsiasi endpoint di conversazione di destinazione il cui nome del servizio di destinazione corrisponde a LocalServiceName.

    • ANY

      • Specifica che la priorità di conversazione può essere applicata a qualsiasi endpoint di conversazione, indipendentemente dal nome del servizio locale utilizzato dall'endpoint.

    Il valore predefinito è ANY.

  • REMOTE_SERVICE_NAME = {'RemoteServiceName' | ANY}
    Specifica il nome di un servizio da utilizzare come criterio per determinare se la priorità di conversazione si applica a un endpoint di conversazione.

    RemoteServiceName è un valore letterale di tipo nvarchar(256). In Service Broker viene utilizzato un confronto byte per byte per trovare la corrispondenza con la stringa RemoteServiceName. Nel confronto viene fatta distinzione tra maiuscole e minuscole e non vengono considerate le regole di confronto correnti. Il servizio di destinazione può trovarsi nell'istanza corrente di Motore di database o in un'istanza remota di Motore di database.

    • 'RemoteServiceName'
      Specifica che la priorità di conversazione può essere applicata agli elementi seguenti:

      • Qualsiasi endpoint di conversazione dell'initiator il cui nome del servizio di destinazione associato corrisponde a RemoteServiceName.

      • Qualsiasi endpoint di conversazione di destinazione il cui nome del servizio Initiator associato corrisponde a RemoteServiceName.

    • ANY
      Specifica che la priorità di conversazione può essere applicata a qualsiasi endpoint di conversazione, indipendentemente dal nome del servizio remoto associato all'endpoint.

    Il valore predefinito è ANY.

  • PRIORITY_LEVEL = { PriorityValue | DEFAULT }
    Specifica la priorità da assegnare a qualsiasi endpoint di conversazione che utilizza i contratti e i servizi specificati nella priorità di conversazione. PriorityValue deve essere un valore letterale intero compreso tra 1 (priorità più bassa) e 10 (priorità più elevata). Il valore predefinito è 5.

Osservazioni

Service Broker assegna i livelli di priorità agli endpoint di conversazione. I livelli di priorità controllano la priorità delle operazioni associate all'endpoint. Ciascuna conversazione presenta due endpoint di conversazione:

  • L'endpoint di conversazione dell'initiator associa un lato della conversazione al servizio Initiator e alla coda dell'initiator. L'endpoint di conversazione dell'Initiator viene creato quando l'istruzione BEGIN DIALOG viene eseguita. Le operazioni associate all'endpoint di conversazione dell'initiator includono:

    • Invio dal servizio Initiator.

    • Ricezione dalla coda dell'initiator.

    • Recupero del successivo gruppo di conversazioni dalla coda dell'Initiator.

  • L'endpoint di conversazione di destinazione associa l'altro lato della conversazione al servizio e alla coda di destinazione. L'endpoint di conversazione di destinazione viene creato quando la conversazione viene utilizzata per inviare un messaggio alla coda di destinazione. Le operazioni associate all'endpoint di conversazione di destinazione includono:

    • Ricezione dalla coda di destinazione.

    • Invio dal servizio di destinazione.

    • Recupero del gruppo di conversazioni successivo dalla coda di destinazione.

Service Broker assegna i livelli di priorità di conversazione quando vengono creati gli endpoint di conversazione. L'endpoint di conversazione conserva il livello di priorità fino alla fine della conversazione. Le nuove priorità o le modifiche alle priorità esistenti non sono applicate alle conversazioni esistenti.

Service Broker assegna il livello di priorità a un endpoint di conversazione in base alla priorità di conversazione con criteri di contratto e servizi maggiormente corrispondenti alle proprietà dell'endpoint. Nella tabella seguente viene indicata la precedenza tra le corrispondenze:

Contratto dell'operazione

Servizio locale dell'operazione

Servizio remoto dell'operazione

ContractName

LocalServiceName

RemoteServiceName

ContractName

LocalServiceName

ANY

ContractName

ANY

RemoteServiceName

ContractName

ANY

ANY

ANY

LocalServiceName

RemoteServiceName

ANY

LocalServiceName

ANY

ANY

ANY

RemoteServiceName

ANY

ANY

ANY

Tramite Service Broker viene innanzitutto eseguita la ricerca di una priorità i cui contratto, servizio locale e servizio remoto specificati corrispondano a quelli utilizzati dall'operazione. Se tale priorità non viene trovata, tramite Service Broker viene eseguita la ricerca di una priorità con un contratto e un servizio locale corrispondenti a quelli utilizzati dall'operazione e per cui il servizio remoto sia stato specificato come ANY. La ricerca procede quindi in questo modo per tutte le variazioni elencate nella tabella delle precedenze. Se non viene trovata alcuna corrispondenza, all'operazione viene assegnata la priorità predefinita di 5.

Service Broker assegna indipendentemente un livello di priorità a ogni endpoint di conversazione. Affinché Service Broker assegni livelli di priorità agli endpoint di conversazione sia dell'initiator che di destinazione, è necessario verificare che per entrambi gli endpoint siano state specificate priorità di conversazione. Se gli endpoint di conversazione dell'initiator e di destinazione sono in database separati, è necessario creare le priorità di conversazione in ogni database. In genere per entrambi gli endpoint di conversazione viene specificato lo stesso livello di priorità, ma è possibile specificare livelli di priorità diversi.

I livelli di priorità sono applicati sempre a operazioni che ricevono messaggi o identificatori di gruppi di conversazioni da una coda. I livelli di priorità vengono applicati anche durante la trasmissione di messaggi da un'istanza di Motore di database a un'altra.

I livelli di priorità non vengono utilizzati quando i messaggi vengono trasferiti:

  • Da un database in cui l'opzione HONOR_BROKER_PRIORITY è impostata su OFF. Per ulteriori informazioni, vedere Opzioni ALTER DATABASE SET (Transact-SQL).

  • Tra servizi nella stessa istanza del Motore di database.

  • Se non sono state create priorità di conversazione nel database, a tutte le operazioni di Service Broker in un database viene assegnata la priorità predefinita di 5.

Autorizzazioni

L'autorizzazione per la creazione di una priorità di conversazione viene assegnata per impostazione predefinita ai membri del ruolo predefinito del database db_ddladmin o db_owner e al ruolo predefinito del server sysadmin. È richiesta l'autorizzazione ALTER per il database.

Esempi

A. Assegnazione di un livello di priorità a entrambe le direzioni di una conversazione.

Queste due priorità di conversazione assicurano che a tutte le operazioni che utilizzano SimpleContract tra TargetService e InitiatorAService venga assegnato il livello di priorità 3.

CREATE BROKER PRIORITY InitiatorAToTargetPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = InitiatorServiceA,
         REMOTE_SERVICE_NAME = N'TargetService',
         PRIORITY_LEVEL = 3);
CREATE BROKER PRIORITY TargetToInitiatorAPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = TargetService,
         REMOTE_SERVICE_NAME = N'InitiatorServiceA',
         PRIORITY_LEVEL = 3);

B. Impostazione del livello di priorità per tutte le conversazioni che utilizzano un contratto

Viene assegnato un livello di priorità 7 a tutte le operazioni che utilizzano un contratto denominato SimpleContract. Questo presuppone che non vi siano altre priorità che specificano SimpleContract e un servizio locale o remoto.

CREATE BROKER PRIORITY SimpleContractDefaultPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = ANY,
         REMOTE_SERVICE_NAME = ANY,
         PRIORITY_LEVEL = 7);

C. Impostazione di un livello di priorità di base per un database.

Vengono definite le priorità di conversazione per due servizi specifici e quindi una priorità di conversazione per tutti gli altri endpoint di conversazione. La priorità predefinita non viene sostituita, e rimane sempre 5, ma viene ridotto il numero di elementi a cui è assegnato il valore predefinito.

CREATE BROKER PRIORITY [//Adventure-Works.com/Expenses/ClaimPriority]
    FOR CONVERSATION
    SET (CONTRACT_NAME = ANY,
         LOCAL_SERVICE_NAME = //Adventure-Works.com/Expenses/ClaimService,
         REMOTE_SERVICE_NAME = ANY,
         PRIORITY_LEVEL = 9);
CREATE BROKER PRIORITY [//Adventure-Works.com/Expenses/ApprovalPriority]
    FOR CONVERSATION
    SET (CONTRACT_NAME = ANY,
         LOCAL_SERVICE_NAME = //Adventure-Works.com/Expenses/ClaimService,
         REMOTE_SERVICE_NAME = ANY,
         PRIORITY_LEVEL = 6);
CREATE BROKER PRIORITY [//Adventure-Works.com/Expenses/BasePriority]
    FOR CONVERSATION
    SET (CONTRACT_NAME = ANY,
         LOCAL_SERVICE_NAME = ANY,
         REMOTE_SERVICE_NAME = ANY,
         PRIORITY_LEVEL = 3);

D. Creazione di tre livelli di priorità per un servizio di destinazione utilizzando i servizi

L'esempio seguente supporta un sistema che fornisce tre livelli di prestazione: Gold (più elevato), Silver (medio) e Bronze (più basso). È presente un contratto, ma ogni livello prevede un servizio Initiator separato. Tutti i servizi Initiator comunicano con un servizio di destinazione centrale.

CREATE BROKER PRIORITY GoldInitToTargetPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = GoldInitiatorService,
         REMOTE_SERVICE_NAME = N'TargetService',
         PRIORITY_LEVEL = 6);
CREATE BROKER PRIORITY GoldTargetToInitPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = TargetService,
         REMOTE_SERVICE_NAME = N'GoldInitiatorService',
         PRIORITY_LEVEL = 6);
CREATE BROKER PRIORITY SilverInitToTargetPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = SilverInitiatorService,
         REMOTE_SERVICE_NAME = N'TargetService',
         PRIORITY_LEVEL = 4);
CREATE BROKER PRIORITY SilverTargetToInitPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = TargetService,
         REMOTE_SERVICE_NAME = N'SilverInitiatorService',
         PRIORITY_LEVEL = 4);
CREATE BROKER PRIORITY BronzeInitToTargetPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = BronzeInitiatorService,
         REMOTE_SERVICE_NAME = N'TargetService',
         PRIORITY_LEVEL = 2);
CREATE BROKER PRIORITY BronzeTargetToInitPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = TargetService,
         REMOTE_SERVICE_NAME = N'BronzeInitiatorService',
         PRIORITY_LEVEL = 2);

E. Creazione di tre livelli di priorità per più servizi utilizzando i contratti

L'esempio seguente supporta un sistema che fornisce tre livelli di prestazione: Gold (più elevato), Silver (medio) e Bronze (più basso). Per ogni livello è presente un contratto separato. Queste priorità si applicano a qualsiasi servizio a cui fanno riferimento le conversazioni che utilizzano i contratti.

CREATE BROKER PRIORITY GoldPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = GoldContract,
         LOCAL_SERVICE_NAME = ANY,
         REMOTE_SERVICE_NAME = ANY,
         PRIORITY_LEVEL = 6);
CREATE BROKER PRIORITY SilverPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SilverContract,
         LOCAL_SERVICE_NAME = ANY,
         REMOTE_SERVICE_NAME = ANY,
         PRIORITY_LEVEL = 4);
CREATE BROKER PRIORITY BronzePriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = BronzeContract,
         LOCAL_SERVICE_NAME = ANY,
         REMOTE_SERVICE_NAME = ANY,
         PRIORITY_LEVEL = 2);