CREATE BROKER PRIORITY (Transact-SQL)

適用於:SQL ServerAzure SQL 受控執行個體

定義優先權層級,以及用來判斷要為哪一個 Service Broker 交談指派此優先權層級的準則集。 此優先權等級會指派給使用相同合約與服務組合 (在此交談優先權內指定) 的任何交談端點。 優先權的範圍值是從 1 (低) 到 10 (高)。 預設值為 5。

Transact-SQL 語法慣例

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

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

ConversationPriorityName
指定此交談優先權的名稱。 此名稱在目前資料庫中必須是唯一,且必須符合資料庫引擎識別碼的規則。

SET
指定用來判斷交談優先權是否套用到交談的準則。 如果有指定,SET 至少必須包含一個準則:CONTRACT_NAME、LOCAL_SERVICE_NAME、REMOTE_SERVICE_NAME 或 PRIORITY_LEVEL。 如果未指定 SET,所有的三個準則都會設定預設值。

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 會將優先權層級指派給交談端點。 優先權等級會控制與此端點有關之作業的優先權。 每個交談都具有兩個交談端點:

  • 起始端交談端點會讓交談的某一端與起始端服務和起始端佇列產生關聯。 起始端交談端點是在執行 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 將優先權層級指派給啟動器和目標交談端點,您必須確保這兩個端點都會由交談優先權所涵蓋。 如果起始端和目標交談端點位於個別的資料庫中,您就必須在每個資料庫中建立交談優先權。 通常系統會針對某個交談的兩個交談端點指定相同的優先權等級,但是您可以指定不同的優先權等級。

優先權等級永遠會套用至從佇列接收訊息或交談群組識別碼的作業。 當訊息從某個資料庫引擎執行個體傳輸到另一個執行個體時,也會套用優先權層級。

在傳輸以下訊息時,不會使用優先權等級:

  • 從 HONOR_BROKER_PRIORITY 資料庫選項設定為 OFF 的資料庫傳輸訊息。 如需詳細資訊,請參閱 ALTER DATABASE SET 選項 (Transact-SQL)

  • 相同 Database Engine 執行個體的服務之間。

  • 如果資料庫中尚未建立任何交談優先權,則資料庫中的所有 Service Broker 作業都會獲指派預設優先權 5。

權限

建立交談優先權的權限預設為 db_ddladmin 或 db_owner 固定資料庫角色的成員,以及 sysadmin 固定伺服器角色的成員。 需要資料庫的 ALTER 權限。

範例

A. 指派優先權等級給交談的兩個方向。

這兩個交談優先權可確保在 SimpleContractTargetService 之間使用 InitiatorAService 的所有作業都會被指派優先權等級 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. 針對使用合約的所有交談設定優先權等級

將優先權等級 7 指派給使用名為 SimpleContract 之合約的所有作業。 這會假設沒有其他優先權同時指定 SimpleContract 以及本機或遠端服務。

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

C. 為資料庫設定基本優先權等級。

為兩個特定的服務定義交談優先權,然後定義一個將會符合所有其他交談端點的交談優先權。 這樣並不會取代預設優先權 (一定是 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. 使用服務來為目標服務建立三個優先權等級

支援提供三個效能層級的系統:金卡 (高)、銀卡 (中) 和青銅卡 (低)。 這是一個合約,但是每一個等級都有不同的起始端服務。 所有的起始端服務都會與中央目標服務通訊。

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. 使用合約來為多個服務建立三個優先權等級

支援提供三個效能層級的系統:金卡 (高)、銀卡 (中) 和青銅卡 (低)。 每一個等級都有不同的合約。 這些優先權會套用到由使用合約的交談所參考的任何服務。

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

另請參閱

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)