CREATE BROKER PRIORITY (Transact-SQL)

優先順位と、その優先順位を割り当てる Service Broker メッセージ交換を判断するための一連の条件を定義します。優先順位は、メッセージ交換の優先度で指定されているものと同じコントラクトとサービスの組み合わせを使用するすべてのメッセージ交換のエンドポイントに割り当てられます。優先度は、1 (低) ~ 10 (高) までの範囲の値です。既定値は 5 です。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

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

引数

  • ConversationPriorityName
    メッセージ交換の優先度の名前を指定します。名前は現在のデータベース内で一意であり、データベース エンジンの識別子の規則に従っている必要があります。

  • SET
    指定したメッセージ交換の優先度をメッセージ交換に適用するかどうかを決定するための条件を指定します。指定する場合、SET には、CONTRACT_NAME、LOCAL_SERVICE_NAME、REMOTE_SERVICE_NAME、PRIORITY_LEVEL の各条件のうち、少なくとも 1 つを指定する必要があります。SET を指定しない場合は、3 つの条件にはすべて既定値が設定されます。

  • CONTRACT_NAME = {ContractName | ANY}
    メッセージ交換の優先度をメッセージ交換に適用するかどうかを決定するための条件として使用するコントラクトの名前を指定します。ContractName はデータベース エンジン識別子で、現在のデータベース内のコントラクトの名前を指定する必要があります。

    • ContractName
      メッセージ交換の優先度を適用できるのは、メッセージ交換を開始した BEGIN DIALOG ステートメントで ON CONTRACT ContractName が指定されたメッセージ交換だけであることを指定します。

    • ANY
      使用するコントラクトに関係なく、メッセージ交換の優先度をどのメッセージ交換にも適用できることを指定します。

    既定値は ANY です。

  • LOCAL_SERVICE_NAME = {LocalServiceName | ANY}
    メッセージ交換の優先度をメッセージ交換のエンドポイントに適用するかどうかを決定するための条件として使用するサービスの名前を指定します。

    LocalServiceName はデータベース エンジン識別子です。この値には、現在のデータベース内にあるサービスの名前を指定する必要があります。

    • LocalServiceName
      メッセージ交換の優先度を次のメッセージ交換のエンドポイントに適用できることを指定します。

      • 発信側サービス名が LocalServiceName に一致する任意の発信側メッセージ交換のエンドポイント

      • 発信先サービス名が LocalServiceName に一致する任意の発信先メッセージ交換のエンドポイント

    • ANY

      • エンドポイントで使用されるローカル サービスの名前に関係なく、メッセージ交換の優先度をどのメッセージ交換のエンドポイントにも適用できることを指定します。

    既定値は ANY です。

  • REMOTE_SERVICE_NAME = {'RemoteServiceName' | ANY}
    メッセージ交換の優先度をメッセージ交換のエンドポイントに適用するかどうかを決定するための条件として使用するサービスの名前を指定します。

    RemoteServiceName は nvarchar(256) 型のリテラルです。Service Broker では、RemoteServiceName 文字列がバイト単位で照合されます。この比較では、大文字と小文字が区別され、現在の照合順序は考慮されません。発信先サービスは、データベース エンジンの現在のインスタンス内にあっても、データベース エンジンのリモート インスタンス内にあってもかまいません。

    • 'RemoteServiceName'
      メッセージ交換の優先度を次のメッセージ交換のエンドポイントに適用できることを指定します。

      • 関連付けられている発信先サービス名が RemoteServiceName に一致する任意の発信側メッセージ交換のエンドポイント

      • 関連付けられている発信側サービス名が RemoteServiceName に一致する任意の発信先メッセージ交換のエンドポイント

    • ANY
      エンドポイントに関連付けられているリモート サービスの名前に関係なく、メッセージ交換の優先度をどのメッセージ交換のエンドポイントにも適用できることを指定します。

    既定値は ANY です。

  • PRIORITY_LEVEL = { PriorityValue | DEFAULT }
    メッセージ交換の優先度で指定されているコントラクトおよびサービスを使用するすべてのメッセージ交換のエンドポイントに割り当てる優先度を指定します。PriorityValue には、1 (最も低い優先度) ~ 10 (最も高い優先度) の整数リテラルを指定する必要があります。既定値は 5 です。

説明

Service Broker では、メッセージ交換のエンドポイントに優先順位を割り当てます。この優先順位によって、エンドポイントに関連付けられている操作の優先度が制御されます。各メッセージ交換には、2 つのメッセージ交換エンドポイントがあります。

  • 発信側メッセージ交換エンドポイントは、メッセージ交換の一方を発信側サービスおよび発信側キューに関連付けます。発信側メッセージ交換エンドポイントは、BEGIN DIALOG ステートメントが実行されたときに作成されます。発信側メッセージ交換エンドポイントに関連付けられる操作には、次のものがあります。

    • 発信側サービスから送信する。

    • 発信側キューから受信する。

    • 発信側キューから次に使用できるメッセージ交換グループを取得する。

  • 発信先メッセージ交換エンドポイントは、メッセージ交換の相手側を発信先のサービスおよびキューに関連付けます。発信先メッセージ交換エンドポイントは、メッセージ交換が発信先キューへのメッセージの送信に使用されたときに作成されます。発信先メッセージ交換エンドポイントに関連付けられる操作には、次のものがあります。

    • 発信先キューから受信する。

    • 発信先サービスから送信する。

    • 発信先キューから次に使用できるメッセージ交換グループを取得する。

Service Broker では、メッセージ交換エンドポイントが作成されるときに、メッセージ交換の優先順位を割り当てます。メッセージ交換エンドポイントでは、メッセージ交換が終了するまでその優先度レベルが保持されます。新しい優先度や、既存の優先度に対する変更は、既存のメッセージ交換には適用されません。

Service Broker でメッセージ交換のエンドポイントに割り当てる優先度レベルは、そのエンドポイントのプロパティに最も一致するコントラクトおよびサービスの条件を持つメッセージ交換の優先度の優先順位です。その検索順序を次の表に示します。

操作のコントラクト

操作のローカル サービス

操作のリモート サービス

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 では、指定されたコントラクト、ローカル サービス、およびリモート サービスが、操作で使用されるものと一致する優先度を最初に検索します。その優先度が見つからなかった場合、Service Broker では、コントラクトおよびローカル サービスが操作で使用されるものと一致し、かつリモート サービスが ANY と指定された優先度を検索します。この検索を、上の表に示されているすべての組み合わせに対して継続します。一致する優先度が見つからない場合、その操作には既定の優先度 5 が割り当てられます。

Service Broker では、メッセージ交換の各エンドポイントに優先度レベルを個別に割り当てます。Service Broker で発信側と発信先の両方のメッセージ交換エンドポイントに優先順位を割り当てるようにするには、両方のエンドポイントをメッセージ交換の優先度に含める必要があります。発信側と発信先のメッセージ交換エンドポイントが別々のデータベースにある場合、各データベースでメッセージ交換の優先度を作成する必要があります。通常は、メッセージ交換の両方のエンドポイントに対して同じ優先度レベルを指定しますが、異なる優先順位を指定することもできます。

優先順位は、メッセージまたはメッセージ交換グループ ID をキューから受信する操作に常に適用されます。優先順位は、データベース エンジンのいずれかのインスタンスから別のインスタンスにメッセージを送信するときにも適用されます。

優先順位は、次の場合はメッセージの送信時に使用されません。

  • HONOR_BROKER_PRIORITY データベース オプションが OFF に設定されているデータベースからの送信。詳細については、「ALTER DATABASE の SET オプション (Transact-SQL)」を参照してください。

  • データベース エンジンの同一インスタンスのサービス間での送信。

  • データベースでメッセージ交換の優先度が作成されていない場合は、データベース内のすべての Service Broker 操作に既定の優先度 5 が割り当てられます。

権限

メッセージ交換の優先度を作成する権限は、既定では db_ddladmin 固定データベース ロールまたは db_owner 固定データベース ロールのメンバ、および sysadmin 固定サーバー ロールのメンバに与えられています。データベースに対する ALTER 権限が必要です。

A. メッセージ交換の両方向に優先度レベルを割り当てる

この 2 つのメッセージ交換の優先度では、TargetService と InitiatorAService の間で SimpleContract を使用するすべての操作に優先度レベル 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. 特定のコントラクトを使用するすべてのメッセージ交換の優先度レベルを設定する

SimpleContract というコントラクトを使用するすべての操作に優先度レベル 7 を割り当てます。これは、SimpleContract とローカル サービスまたはリモート サービスを指定する優先度が他にないことを前提にしています。

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

C. データベースの基本の優先度レベルを設定する

2 つの特定のサービスに対するメッセージ交換の優先度を定義し、次に、その他のすべてのメッセージ交換のエンドポイントに一致するメッセージ交換の優先度を定義します。これは既定の優先度 (常に 5) に代わるものではありませんが、既定値が割り当てられる項目数を最小限にします。

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. サービスを使用して、1 つの発信先サービスに対して 3 つの優先順位を作成する

ゴールド (高)、シルバー (中)、ブロンズ (低) の 3 つのパフォーマンス レベルを備えたシステムをサポートします。コントラクトは 1 つですが、各レベルには個別の発信側サービスがあります。すべての発信側サービスは、中心となる 1 つの発信先サービスと通信します。

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. コントラクトを使用して、複数のサービスに対して 3 つの優先順位を作成する

ゴールド (高)、シルバー (中)、ブロンズ (低) の 3 つのパフォーマンス レベルを備えたシステムをサポートします。各レベルには、個別のコントラクトがあります。これらの優先度は、そのコントラクトを使用するメッセージ交換によって参照されるすべてのサービスに適用されます。

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