Teilen über


CREATE BROKER PRIORITY (Transact-SQL)

Gilt für: SQL Server Azure SQL Managed Instance

Definiert eine Prioritätsebene und die Kriterien, anhand derer bestimmt wird, welchen Service Broker-Konversationen die Prioritätsebene zugewiesen wird. Die Prioritätsebene wird jedem Konversationsendpunkt zugeordnet, der die gleiche Kombination aus Verträgen und Diensten verwendet, die für die Konversationspriorität angegeben sind. Die Prioritätswerte liegen zwischen 1 (niedrig) und 10 (hoch). Der Standardwert ist 5.

Transact-SQL-Syntaxkonventionen

Syntax

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 } ]  
       )  
]  
[;]  
  

Argumente

ConversationPriorityName
Gibt den Namen für diese Konversationspriorität an. Der Name muss in der aktuellen Datenbank eindeutig sein und den Regeln für Datenbank-Engine-Bezeichner entsprechen.

SET
Gibt die Kriterien an, anhand derer bestimmt wird, ob die Konversationspriorität für eine Konversation übernommen wird. Wenn angegeben, muss SET mindestens ein Kriterium enthalten: CONTRACT_NAME, LOCAL_SERVICE_NAME, REMOTE_SERVICE_NAME oder PRIORITY_LEVEL. Wenn SET nicht angegeben wird, werden für alle drei Kriterien die Standardwerte festgelegt.

CONTRACT_NAME = {ContractName | ANY}
Gibt den Namen eines Vertrags an, der als Kriterium für die Festlegung verwendet wird, ob die Konversationspriorität für eine Konversation gelten soll. ContractName ist ein Datenbank-Engine-Bezeichner und muss den Namen eines Vertrags in der aktuellen Datenbank angeben.

ContractName
Gibt an, dass die Konversationspriorität nur für Konversationen übernommen werden kann, bei denen die BEGIN DIALOG-Anweisung, mit der die Konversation gestartet wurde, auf ON CONTRACT ContractName festgelegt ist.

ANY
Gibt an, dass die Konversationspriorität für jede Konversation unabhängig vom verwendeten Vertrag übernommen werden kann.

Der Standardwert ist ANY.

LOCAL_SERVICE_NAME = {LocalServiceName | ANY}
Gibt den Namen eines Diensts an, der als Kriterium verwendet werden kann, um zu bestimmen, ob die Konversationspriorität für einen Konversationsendpunkt übernommen wird.

LocalServiceName ist ein Datenbank-Engine-Bezeichner. Mit diesem muss der Name eines Diensts in der aktuellen Datenbank angegeben werden.

LocalServiceName
Gibt an, dass die Konversationspriorität für Folgendes übernommen werden kann:

  • Jeder Konversationsendpunkt für den Initiator, dessen Initiatordienstname LocalServiceName entspricht.

  • Jeder Konversationsendpunkt für das Ziel, dessen Zieldienstname LocalServiceName entspricht.

ANY

  • Gibt an, dass die Konversationspriorität unabhängig vom Namen des vom Endpunkt verwendeten lokalen Diensts für jeden Konversationsendpunkt übernommen werden kann.

Der Standardwert ist ANY.

REMOTE_SERVICE_NAME = {'RemoteServiceName' | ANY}
Gibt den Namen eines Diensts an, der als Kriterium verwendet werden kann, um zu bestimmen, ob die Konversationspriorität für einen Konversationsendpunkt übernommen wird.

RemoteServiceName ist ein Literal vom Typ nvarchar(256). Service Broker verwendet einen bitweisen Vergleich für den Abgleich der RemoteServiceName-Zeichenfolge. Bei dem Vergleich wird die Groß-/Kleinschreibung beachtet, die aktuelle Sortierung hingegen wird nicht berücksichtigt. Der Zieldienst kann in der aktuellen Instanz von Datenbank-Engine oder in einer Remoteinstanz von Datenbank-Engine vorhanden sein.

'RemoteServiceName'
Gibt an, dass die Konversationspriorität für Folgendes übernommen werden kann:

  • Jeder Konversationsendpunkt für den Initiator, dessen zugeordneter Zieldienstname RemoteServiceName entspricht.

  • Jeder Konversationsendpunkt für das Ziel, dessen zugeordneter Initiatordienstname RemoteServiceName entspricht.

ANY
Gibt an, dass die Konversationspriorität unabhängig vom Namen des dem Endpunkt zugeordneten Remotediensts für jeden Konversationsendpunkt übernommen werden kann.

Der Standardwert ist ANY.

PRIORITY_LEVEL = { PriorityValue | DEFAULT }
Gibt die Priorität an, die jedem Konversationsendpunkt zugeordnet werden soll, der die für die Konversationspriorität angegebenen Verträge und Dienste verwendet. PriorityValue muss ein ganzahliges Literal zwischen 1 (niedrigste Priorität) und 10 (höchste Priorität) sein. Der Standardwert ist 5.

Bemerkungen

In Service Broker werden Prioritätsebenen Konversationsendpunkte zugewiesen. Mithilfe der Prioritätsebene wird die Priorität der dem Endpunkt zugeordneten Vorgänge gesteuert. Jede Konversation verfügt über zwei Konversationsendpunkte:

  • Der Konversationsendpunkt für den Initiator ordnet eine Seite der Konversation dem Initiatordienst und der Initiatorwarteschlange zu. Der Konversationsendpunkt für den Initiator wird beim Ausführen der BEGIN DIALOG-Anweisung erstellt. Zu den dem Konversationsendpunkt für den Initiator zugeordneten Vorgängen zählen folgende:

    • Sendevorgänge vom Initiatordienst.

    • Empfangsvorgänge von der Initiatorwarteschlange.

    • Das Abrufen der nächsten Konversationsgruppe aus der Initiatorwarteschlange

  • Der Konversationsendpunkt für das Ziel ordnet die andere Seite der Konversation dem Zieldienst und der Warteschlange zu. Der Konversationsendpunkt für das Ziel wird erstellt, wenn mithilfe der Konversation eine Nachricht an die Zielwarteschlange übermittelt wird. Zu den dem Konversationsendpunkt für das Ziel zugeordneten Vorgängen zählen folgende:

    • Empfangsvorgänge von der Zielwarteschlange.

    • Sendevorgänge vom Zieldienst.

    • Das Abrufen der nächsten Konversationsgruppe aus der Zielwarteschlange.

In Service Broker werden Konversationsprioritätsebenen beim Erstellen von Endpunkten zugewiesen. Der Konversationsendpunkt behält die Prioritätsstufe bei, bis die Konversation beendet ist. Neue Prioritäten oder Änderungen an vorhandenen Prioritäten werden nicht für vorhandene Konversationen übernommen.

Service Broker weist einem Konversationsendpunkt die Prioritätsebene von der Konversationspriorität zu, deren Vertrags- und Dienstkriterien die größte Übereinstimmung mit den Eigenschaften des Endpunkts aufweisen. In der folgenden Tabelle wird die Rangfolge bei Übereinstimmungen angezeigt:

Vertrag des Vorgangs Lokaler Dienst des Vorgangs Remotedienst des Vorgangs
ContractName LocalServiceName RemoteServiceName
ContractName LocalServiceName ANY
ContractName ANY RemoteServiceName
ContractName ANY ANY
ANY LocalServiceName RemoteServiceName
ANY LocalServiceName ANY
ANY ANY RemoteServiceName
ANY ANY ANY

Service Broker sucht zuerst nach einer Priorität, bei der der angegebene Vertrag, der lokale Dienst und der Remotedienst dem Vertrag, dem lokalen Dienst und dem Remotedienst des Vorgangs entsprechen. Wird keine entsprechende Priorität gefunden, sucht Service Broker nach einer Priorität, bei der der Vertrag und der lokale Dienst dem Vertrag und dem lokalen Dienst des Vorgangs entsprechen und für die der Remotedienst als ANY angegeben wurde. Dieser Vorgang wird für alle Varianten fortgesetzt, die in der Rangfolgentabelle aufgeführt werden. Wenn keine Übereinstimmung gefunden wird, wird dem Vorgang die Standardpriorität 5 zugewiesen.

Service Broker weist allen Konversationsendpunkten unabhängig voneinander eine Prioritätsstufe zu. Damit Service Broker Prioritätsebenen dem Konversationsendpunkt für den Initiator und das Ziel zuweist, müssen Sie sicherstellen, dass beiden Endpunkten Konversationsprioritäten zugewiesen wurden. Wenn sich die Konversationsendpunkte für den Initiator und das Ziel in verschiedenen Datenbanken befinden, müssen Sie in jeder Datenbank Konversationsprioritäten erstellen. In der Regel wird die gleiche Prioritätsebene für beide Konversationsendpunkte einer Konversation angegeben; Sie können aber auch verschiedene Prioritätsebenen angeben.

Prioritätsebenen werden immer für Vorgänge übernommen, die Nachrichten oder Konversationsgruppenbezeichner aus einer Warteschlange empfangen. Prioritätsebenen werden auch übernommen, wenn Nachrichten von einer Instanz der Datenbank-Engine an eine andere übermittelt werden.

Prioritätsebenen werden nicht verwendet, wenn für die Nachrichtenübermittlung Folgendes zutrifft:

  • Nachrichten werden aus einer Datenbank übermittelt, für die die Datenbankoption HONOR_BROKER_PRIORITY auf OFF festgelegt ist. Weitere Informationen finden Sie unter ALTER DATABASE SET-Optionen (Transact-SQL).

  • Nachrichten werden zwischen Diensten in der gleichen Instanz der Datenbank-Engine übermittelt.

  • Allen Service Broker-Vorgängen in einer Datenbank wird die Standardpriorität 5 zugewiesen, wenn in der Datenbank keine Konversationsprioritäten erstellt wurden.

Berechtigungen

Die Berechtigung zum Erstellen einer Konversationspriorität erhalten standardmäßig die Mitglieder der festen Datenbankrolle db_ddladmin oder db_owner und die feste Serverrolle sysadmin. Erfordert die ALTER-Berechtigung für die Datenbank.

Beispiele

A. Zuweisen einer Prioritätsebene zu beiden Richtungen einer Konversation

Mit diesen beiden Konversationsprioritäten wird sichergestellt, dass allen Vorgänge, die SimpleContract zwischen TargetService und InitiatorAService verwenden, die Prioritätsebene 3 zugewiesen wird.

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. Festlegen der Prioritätsebene für alle Konversationen, die einen Vertrag verwenden

Weist allen Vorgängen, die einen Vertrag mit dem Namen 7 verwenden, eine Prioritätsebene von SimpleContract zu. Dabei wird davon ausgegangen, dass keine anderen Prioritäten vorhanden sind, mit denen sowohl SimpleContract als auch entweder ein lokaler oder ein Remotedienst angegeben werden.

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

C. Festlegen einer Basisprioritätsebene für eine Datenbank

Definiert die Konversationsprioritäten für zwei bestimmte Dienste und definiert dann eine Konversationspriorität, die mit allen anderen Konversationsendpunkten übereinstimmt. Dadurch wird nicht die Standardpriorität ersetzt, die stets den Wert 5 aufweist, aber es wird die Anzahl von Elementen reduziert, denen die Standardpriorität zugewiesen ist.

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: Erstellen von drei Prioritätsebenen für einen Zieldienst mithilfe von Diensten

Unterstützt ein System, das drei Leistungsebenen bereitstellt: Gold (hoch), Silver (mittel) und Bronze (niedrig). Es gibt einen Vertrag, aber jede Ebene weist einen separaten Initiatordienst auf. Alle Initiatordienste kommunizieren mit einem zentralen Zieldienst.

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. Erstellen von drei Prioritätsebenen für mehrere Dienste mithilfe von Verträgen

Unterstützt ein System, das drei Leistungsebenen bereitstellt: Gold (hoch), Silver (mittel) und Bronze (niedrig). Jede Ebene weist einen separaten Vertrag auf. Diese Prioritäten werden für alle Dienste übernommen, auf die von Konversationen verwiesen wird, die die Verträge verwenden.

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

Weitere Informationen

ALTER BROKER PRIORITY (Transact-SQL)
BEGIN DIALOG CONVERSATION (Transact-SQL)
CREATE CONTRACT (Transact-SQL)
CREATE QUEUE (Transact-SQL)
CREATE SERVICE (Transact-SQL)
DROP BROKER PRIORITY (Transact-SQL)
GET CONVERSATION GROUP (Transact-SQL)
RECEIVE (Transact-SQL)
SEND (Transact-SQL)
sys.conversation_priorities (Transact-SQL)