CREATE BROKER PRIORITY (Transact-SQL)

Definiert eine Prioritätsebene und die Gruppe von Kriterien, anhand derer bestimmt wird, welchen Service Broker-Konversationen die Prioritätsebene zugeordnet 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.

Themenlink (Symbol)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. Namen müssen in der aktuellen Datenbank eindeutig sein und den Regeln für Database Engine (Datenbankmodul)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 verwendet wird, um zu bestimmen, ob die Konversationspriorität für eine Konversation übernommen wird. ContractName ist ein Bezeichner von Database Engine (Datenbankmodul), mit dem der Name eines Vertrags in der aktuellen Datenbank angegeben werden muss.

    • 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 wird, um zu bestimmen, ob die Konversationspriorität für einen Konversationsendpunkt übernommen wird.

    LocalServiceName ist ein Bezeichner von Database Engine (Datenbankmodul). 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:

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

      • Jeden 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 Vergleich auf Byteebene, um eine Übereinstimmung für die Zeichenfolge RemoteServiceName festzustellen. Bei dem Vergleich wird die Groß-/Kleinschreibung beachtet, die aktuelle Sortierung hingegen wird nicht berücksichtigt. Der Zieldienst kann in der aktuellen Instanz von Database Engine (Datenbankmodul) oder in einer Remoteinstanz von Database Engine (Datenbankmodul) vorhanden sein.

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

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

      • Jeden 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 wird, der die Verträge und Dienste verwendet, die für die Konversationspriorität angegeben sind. PriorityValue muss ein Integer-Literalwert zwischen 1 (niedrigste Priorität) und 10 (höchste Priorität) sein. Der Standardwert ist 5.

Hinweise

In Service Broker werden Prioritätsebenen Konversationsendpunkte zugeordnet. 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 zugeordnet. 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 ordnet einem Konversationsendpunkt die Prioritätsebene von der Konversationspriorität zu, dessen 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 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 zuordnet, müssen Sie sicherstellen, dass beide Endpunkte von Konversationsprioritäten abgedeckt werden. 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 von Database Engine (Datenbankmodul) 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 des Datenbankmoduls ü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 Konversationsrichtungen

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 SimpleContract verwenden, eine Prioritätsebene von 7 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);