Compartir a través de


CREATE BROKER PRIORITY (Transact-SQL)

Define un nivel de prioridad y el conjunto de criterios para determinar a qué conversaciones de Service Broker se debe asignar el nivel de prioridad. El nivel de prioridad se asignará a cualquier extremo de conversación que utilice la misma combinación de contratos y servicios especificados en la prioridad de conversación. El valor de las prioridades va de 1 (bajo) a 10 (alto). El valor predeterminado es 5.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

  • ConversationPriorityName
    Especifica el nombre para esta prioridad de conversación. El nombre debe ser único en la base de datos actual y debe cumplir a las reglas para los identificadores de Database Engine (Motor de base de datos).

  • SET
    Especifica los criterios para determinar si la prioridad de conversación se aplica a una conversación. Si se especifica, SET debe contener al menos un criterio: CONTRACT_NAME, LOCAL_SERVICE_NAME, REMOTE_SERVICE_NAME o PRIORITY_LEVEL. Si no se especifica SET, se establecen los valores predeterminados para los tres criterios.

  • CONTRACT_NAME = {ContractName | ANY}
    Especifica el nombre de un contrato que se usará como criterio para determinar si la prioridad de conversación se aplica a una conversación. ContractName es un identificador de Database Engine (Motor de base de datos), y debe especificar el nombre de un contrato de la base de datos actual.

    • ContractName
      Especifica que la prioridad de conversación sólo se puede aplicar a las conversaciones cuya instrucción BEGIN DIALOG que inició la conversación especificó ON CONTRACT ContractName.

    • ANY
      Especifica que la prioridad de conversación se puede aplicar a cualquier conversación, independientemente de qué contrato use.

    El valor predeterminado es ANY.

  • LOCAL_SERVICE_NAME = {LocalServiceName | ANY}
    Especifica el nombre de un servicio que se va a usar como criterio para determinar si la prioridad de conversación se aplica a un extremo de una conversación.

    LocalServiceName es un identificador de Database Engine (Motor de base de datos). Debe especificar el nombre de un servicio de la base de datos actual.

    • LocalServiceName
      Especifica que la prioridad de conversación se puede aplicar a lo siguiente:

      • Cualquier extremo iniciador de conversación cuyo nombre de servicio iniciador coincida con LocalServiceName.

      • Cualquier extremo de destino de conversación cuyo nombre de servicio de destino coincida con LocalServiceName.

    • ANY

      • Especifica que la prioridad de conversación se puede aplicar a cualquier extremo de conversación, independientemente del nombre del servicio local utilizado por el extremo.

    El valor predeterminado es ANY.

  • REMOTE_SERVICE_NAME = {'RemoteServiceName' | ANY}
    Especifica el nombre de un servicio que se va a usar como criterio para determinar si la prioridad de conversación se aplica a un extremo de una conversación.

    RemoteServiceName es un literal de tipo nvarchar(256). Service Broker utiliza una comparación byte a byte para buscar una coincidencia con la cadena RemoteServiceName. En la comparación se distinguen mayúsculas y minúsculas, y no se considera la intercalación actual. El servicio de destino puede estar en la instancia actual de Database Engine (Motor de base de datos) o en una instancia remota de Database Engine (Motor de base de datos).

    • 'RemoteServiceName'
      Especifica que la prioridad de conversación se puede aplicar a lo siguiente:

      • Cualquier extremo iniciador de conversación cuyo nombre de servicio de destino asociado coincida con RemoteServiceName.

      • Cualquier extremo de destino de conversación cuyo nombre de servicio iniciador asociado coincida con RemoteServiceName.

    • ANY
      Especifica que la prioridad de conversación puede aplicarse a cualquier extremo de conversación, independientemente del nombre del servicio remoto que esté asociado al extremo.

    El valor predeterminado es ANY.

  • PRIORITY_LEVEL = { PriorityValue | DEFAULT }
    Especifica la prioridad que se debe asignar a cualquier extremo de conversación que utilice los contratos y servicios indicados en la prioridad de conversación. PriorityValue debe ser un literal entero comprendido entre 1 (prioridad más baja) y 10 (prioridad más alta). El valor predeterminado es 5.

Notas

Service Broker asigna los niveles de prioridad a los extremos de conversación. Los niveles de prioridad controlan la prioridad de las operaciones asociadas al extremo. Cada conversación tiene dos extremos:

  • El extremo iniciador de conversación asocia un lado de la conversación con el servicio iniciador y con la cola del iniciador. El extremo iniciador de la conversación se crea cuando se ejecuta la instrucción BEGIN DIALOG. Las operaciones que realiza el extremo iniciador de conversación son:

    • Envía desde el servicio iniciador.

    • Recibe desde la cola del iniciador.

    • Obtención del siguiente grupo de conversación desde la cola del iniciador.

  • El extremo de destino de conversación asocia el otro lado de la conversación con el servicio y la cola de destino. El extremo de destino de conversación se crea cuando la conversación se utiliza para enviar un mensaje a la cola de destino. Las operaciones que realiza el extremo de destino de conversación son:

    • Recibe desde la cola de destino.

    • Envía desde el servicio de destino.

    • Obtiene el siguiente grupo de conversación desde la cola de destino.

Service Broker asigna niveles de prioridad de conversación cuando se crean los extremos de conversación. El extremo de conversación conserva el nivel de prioridad hasta que finaliza la conversación. Las prioridades nuevas o los cambios en las existentes no se aplican a las conversaciones existentes.

Service Broker asigna a un extremo de conversación el nivel de prioridad de la prioridad de conversación cuyos criterios de contrato y de servicios coinciden mejor con las propiedades del extremo. En la tabla siguiente se muestra la prioridad de la coincidencia:

Contrato de la operación

Servicio local de la operación

Servicio remoto de la operación

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 primero busca una prioridad cuyo contrato, servicio local y servicio remoto coincide con los que utiliza la operación. Si no lo encuentra, Service Broker busca una prioridad para la que se especificó ANY como servicio remoto y cuyo contrato y servicio local coinciden con los que utiliza la operación. Esto continúa para todas las variaciones incluidas en la tabla de prioridad. Si no se encuentra ninguna coincidencia, se asigna a la operación la prioridad predeterminada, es decir, 5.

Service Broker asigna independientemente un nivel de prioridad a cada extremo de conversación. Para hacer que Service Broker asigne niveles de prioridad tanto al extremo iniciador de conversación como al de destino, debe asegurarse de que ambos extremos estén cubiertos por prioridades de conversación. Si los extremos iniciador y de destino de la conversación están en bases de datos independientes, debe crear prioridades de conversación en cada base de datos. Normalmente se especifica el mismo nivel de prioridad para los dos extremos de una conversación, pero puede especificar niveles de prioridad diferentes.

Los niveles de prioridad siempre se aplican a las operaciones que reciben mensajes o identificadores de grupo de conversación procedentes de una cola. También se aplican cuando se transmiten mensajes desde una instancia de Database Engine (Motor de base de datos) a otra.

Los niveles de prioridad no se utilizan cuando se transmiten mensajes:

  • Desde una base de datos cuya opción de base de datos HONOR_BROKER_PRIORITY está establecida en OFF. Para obtener más información, consulte Opciones de ALTER DATABASE SET (Transact-SQL).

  • Entre servicios de la misma instancia del motor de base de datos.

  • Todas las operaciones de Service Broker de una base de datos tienen asignadas prioridades predeterminadas de 5 si no se ha creado ninguna prioridad de conversación en la base de datos.

Permisos

El permiso para crear una prioridad de conversación recae de forma predeterminada en los miembros de las funciones fijas de base de datos db_ddladmin o db_owner, y en la función fija de servidor sysadmin. Requiere el permiso ALTER en la base de datos.

Ejemplos

A. Asignar un nivel de prioridad a las dos direcciones de una conversación.

Estas dos prioridades de conversación permiten asegurarse de que se asigna el nivel de prioridad 3 a todas las operaciones que utilizan SimpleContract entre TargetService e InitiatorAService.

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. Establecer el nivel de prioridad para todas las conversaciones que utilizan un contrato

Asigna un nivel de prioridad 7 a todas las operaciones que utilizan un contrato denominado SimpleContract. Esto supone que no hay ninguna otra prioridad que especifica SimpleContract y un servicio local o un servicio remoto.

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

C. Establecer un nivel de prioridad base para una base de datos.

Define prioridades de conversación para dos servicios concretos y, a continuación, define una prioridad de conversación que coincidirá con todos los demás extremos de conversación. Esto no reemplaza la prioridad predeterminada, que siempre es 5, pero minimiza el número de elementos a los que se asigna el valor predeterminado.

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. Crear tres niveles de prioridad para un servicio de destino utilizando servicios

Es compatible con un sistema que proporciona tres niveles de rendimiento: Gold (alto), Silver (medio) y Bronze (bajo). Hay un contrato, pero cada nivel tiene un servicio iniciador independiente. Todos los servicios iniciadores se comunican con un servicio de destino central.

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. Crear tres niveles de prioridad para varios servicios utilizando contratos

Es compatible con un sistema que proporciona tres niveles de rendimiento: Gold (alto), Silver (medio) y Bronze (bajo). Cada nivel tiene un contrato independiente. Estas prioridades se aplican a cualquier servicio al que hagan referencia las conversaciones que utilicen los contratos.

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