Поделиться через


CREATE ROUTE (Transact-SQL)

Добавляет новый маршрут к таблице маршрутизации для текущей базы данных. Для исходящих сообщений компонент Service Broker определяет маршруты, проверяя таблицу маршрутов в локальной базе данных. Для сообщений диалогов, начатых в другом экземпляре, включая пересылаемые сообщения, компонент Service Broker проверяет маршруты в базе данных msdb.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

CREATE ROUTE route_name
[ AUTHORIZATION owner_name ]
WITH  
   [ SERVICE_NAME = 'service_name', ]
   [ BROKER_INSTANCE = 'broker_instance_identifier' , ]
   [ LIFETIME = route_lifetime , ]
   ADDRESS =  'next_hop_address'
   [ , MIRROR_ADDRESS = 'next_hop_mirror_address' ]
[ ; ]

Аргументы

  • route_name
    Имя создаваемого маршрута. Новый маршрут создается в текущей базе данных и принадлежит участнику, указанному в предложении AUTHORIZATION. Не могут быть указаны имена сервера, базы данных и схемы. Аргумент route_name должен иметь допустимый тип sysname.

  • AUTHORIZATION owner_name
    Устанавливает заданного пользователя или роль базы данных в качестве владельца маршрута. Аргумент owner_name может быть именем любого допустимого пользователя или роли, если текущий пользователь является членом предопределенной роли базы данных db_owner или предопределенной роли сервера sysadmin. В противном случае аргумент owner_name должен быть именем текущего пользователя, именем пользователя, на олицетворение которого у текущего пользователя есть разрешение IMPERSONATE, или именем роли, к которой принадлежит текущий пользователь. Если это предложение опущено, то маршрут принадлежит текущему пользователю.

  • WITH
    Представляет предложения, которые определяют создаваемый маршрут.

  • SERVICE_NAME = 'service_name'
    Указывает имя удаленной службы, на которую указывает данный маршрут. Аргумент service_name должен точно совпадать с именем удаленной службы. Компонент Service Broker использует побайтовое сравнение с аргументом service_name. Другими словами, при сравнении учитывается регистр и не применяются текущие параметры сортировки. Если аргумент SERVICE_NAME опущен, этот маршрут соответствует любому имени службы, но имеет более низкий приоритет, чем маршрут с аргументом SERVICE_NAME. Маршрут с именем службы SQL/ServiceBroker/BrokerConfiguration — это маршрут к службе «Уведомление конфигурации брокера». В маршруте к этой службе может не указываться экземпляр компонента Service Broker.

  • BROKER_INSTANCE = 'broker_instance_identifier'
    Указывает базу данных, в которой расположена служба назначения. Аргумент broker_instance_identifier должен являться идентификатором экземпляра брокера для удаленной базы данных. Этот идентификатор можно получить, выполнив следующий запрос в выбранной базе данных:

    SELECT service_broker_guid
    FROM sys.databases
    WHERE database_id = DB_ID()
    

    Если предложение BROKER_INSTANCE опущено, то маршрут соответствует любому экземпляру брокера. Маршрут, соответствующий любому экземпляру брокера, имеет более высокий приоритет соответствия, чем маршрут с явным экземпляром брокера, когда диалог не указывает экземпляр брокера. Для диалогов, указывающих экземпляр брокера, маршрут с экземпляром брокера имеет более высокий приоритет, чем маршрут, соответствующий любому экземпляру брокера.

  • LIFETIME **=**route_lifetime
    Время в секундах, в течение которого SQL Server хранит маршрут в таблице маршрутизации. По истечении этого времени действие маршрута истекает и SQL Server больше его не рассматривает при выборе маршрута для новых диалогов. Если предложение опущено, то аргумент route_lifetime имеет значение NULL, и срок маршрута никогда не истекает.

  • ADDRESS ='next_hop_address'
    Указывает сетевой адрес для данного маршрута. Аргумент next_hop_address указывает адрес TCP/IP в следующем формате:

        TCP://{ dns_имя | netbios_имя | ip_адрес } **:**номер_порта

    Указанный аргумент номер_порта должен соответствовать номеру порта конечной точки компонента Service Broker в экземпляре SQL Server на указанном компьютере. Его можно получить, выполнив к выбранной базе данных следующий запрос:

    SELECT tcpe.port
    FROM sys.tcp_endpoints AS tcpe
    INNER JOIN sys.service_broker_endpoints AS ssbe
       ON ssbe.endpoint_id = tcpe.endpoint_id
    WHERE ssbe.name = N'MyServiceBrokerEndpoint';
    

    Если служба находится на зеркальной базе данных, необходимо также указать MIRROR_ADDRESS для другого экземпляра зеркальной базы данных. В противном случае он не будет учитываться в маршруте.

    Если для маршрута в аргументе next_hop_address указывается значение 'LOCAL', сообщение доставляется службе текущего экземпляра SQL Server.

    Если для аргумента next_hop_address указывается значение 'TRANSPORT', сетевой адрес определяется на основе сетевого адреса, указанного в имени службы. Маршрут, определенный со значением 'TRANSPORT', может не указывать имя службы или экземпляр брокера.

  • MIRROR_ADDRESS ='next_hop_mirror_address'
    Указывает сетевой адрес зеркальной базы данных, если одна зеркальная база данных находится по адресу next_hop_address. Аргумент next_hop_mirror_address указывает адрес TCP/IP в следующем формате:

    TCP://{ имя_dns | имя_netbios | ip_адрес } **:**номер_порта

    Указанный аргумент номер_порта должен соответствовать номеру порта конечной точки компонента Service Broker в экземпляре SQL Server на указанном компьютере. Его можно получить, выполнив к выбранной базе данных следующий запрос:

    SELECT tcpe.port
    FROM sys.tcp_endpoints AS tcpe
    INNER JOIN sys.service_broker_endpoints AS ssbe
       ON ssbe.endpoint_id = tcpe.endpoint_id
    WHERE ssbe.name = N'MyServiceBrokerEndpoint';
    

    Если указано предложение MIRROR_ADDRESS, маршрут должен указывать предложения SERVICE_NAME и BROKER_INSTANCE. Для маршрутов с аргументом next_hop_address, имеющим значение 'LOCAL' или 'TRANSPORT', нельзя указывать зеркальный адрес.

Замечания

Таблица маршрутизации, в которой хранятся маршруты, представляет собой таблицу метаданных, данные из которой могут быть получены с помощью представления каталога sys.routes. Это представление каталога может быть обновлено только с помощью инструкций CREATE ROUTE, ALTER ROUTE и DROP ROUTE.

По умолчанию таблица маршрутов в каждой базе данных содержит один маршрут. Этот маршрут называется AutoCreatedLocal. Маршрут указывает значение 'LOCAL' для аргумента next_hop_address и соответствует любому имени службы и идентификатору экземпляра брокера.

Если для аргумента next_hop_address указывается значение 'TRANSPORT', сетевой адрес определяется на основе имени службы. SQL Server может успешно обрабатывать имена служб, начинающиеся с сетевого адреса в допустимом для аргумента next_hop_address формате.

Таблица маршрутов может содержать любое количество маршрутов, указывающих одну и ту же службу, сетевой адрес и идентификатор экземпляра брокера. В этих случаях компонент Service Broker выбирает маршрут с помощью процедуры поиска наиболее точного соответствия сведений, указанных в диалоге, данным, содержащимся в таблице маршрутизации. Дополнительные сведения о выборе маршрута компонентом Service Broker см. в разделе Маршрутизация компонента Service Broker.

Компонент Service Broker не удаляет из таблицы маршрутизации маршруты с истекшим сроком действия. Маршрут с истекшим сроком можно активировать с помощью инструкции ALTER ROUTE.

Маршрут не может быть временным объектом. Допускаются имена маршрутов, начинающиеся с символа #, но они являются постоянными объектами.

Разрешения

Разрешение на создание маршрута по умолчанию имеют члены предопределенных ролей базы данных db_ddladmin и db_owner и члены предопределенной роли сервера sysadmin.

Примеры

А. Создание TCP/IP-маршрута с помощью DNS-имени

В следующем примере создается маршрут к службе //Adventure-Works.com/Expenses. Маршрут указывает, что сообщения для этой службы передаются по протоколу TCP на порт 1234 узла, который определяется DNS-именем www.Adventure-Works.com. Целевой сервер доставляет сообщения по прибытию их на экземпляр брокера, определенный уникальным идентификатором D8D4D268-00A3-4C62-8F91-634B89C1E315.

CREATE ROUTE ExpenseRoute
    WITH
    SERVICE_NAME = '//Adventure-Works.com/Expenses',
    BROKER_INSTANCE = 'D8D4D268-00A3-4C62-8F91-634B89C1E315',
    ADDRESS = 'TCP://www.Adventure-Works.com:1234' ;

Б. Создание TCP/IP-маршрута с помощью NetBIOS-имени

В следующем примере создается маршрут к службе //Adventure-Works.com/Expenses. Маршрут указывает, что сообщения для этой службы передаются по протоколу TCP на порт 1234 узла, который определяется NetBIOS-именем SERVER02. По прибытии сообщения целевой сервер SQL Server доставляет его экземпляру базы данных, определенному уникальным идентификатором D8D4D268-00A3-4C62-8F91-634B89C1E315.

CREATE ROUTE ExpenseRoute
    WITH 
    SERVICE_NAME = '//Adventure-Works.com/Expenses',
    BROKER_INSTANCE = 'D8D4D268-00A3-4C62-8F91-634B89C1E315',
    ADDRESS = 'TCP://SERVER02:1234' ;

В. Создание TCP/IP-маршрута с помощью IP-адреса

В следующем примере создается маршрут к службе //Adventure-Works.com/Expenses. Маршрут указывает, что сообщения для этой службы передаются по протоколу TCP на порт 1234 узла с IP-адресом 192.168.10.2. По прибытии сообщения целевой сервер SQL Server доставляет его экземпляру брокера, определенному уникальным идентификатором D8D4D268-00A3-4C62-8F91-634B89C1E315.

CREATE ROUTE ExpenseRoute
    WITH
    SERVICE_NAME = '//Adventure-Works.com/Expenses',
    BROKER_INSTANCE = 'D8D4D268-00A3-4C62-8F91-634B89C1E315',
    ADDRESS = 'TCP://192.168.10.2:1234' ;

Г. Создание маршрута к брокеру пересылки

В следующем примере создается маршрут к брокеру пересылки на сервере dispatch.Adventure-Works.com. Поскольку не заданы ни имя службы, ни идентификатор экземпляра брокера, SQL Server использует этот маршрут для служб, маршруты которых не определены. Дополнительные сведения о маршрутизации см. в разделе Маршрутизация компонента Service Broker.

CREATE ROUTE ExpenseRoute
    WITH
    ADDRESS = 'TCP://dispatch.Adventure-Works.com' ; 

Д. Создание маршрута к локальной службе

В следующем примере создается маршрут к службе //Adventure-Works.com/LogRequests в том же экземпляре, что и маршрут.

CREATE ROUTE LogRequests
    WITH
    SERVICE_NAME = '//Adventure-Works.com/LogRequests',
    ADDRESS = 'LOCAL' ;

Е. Создание маршрута с заданным сроком жизни

В следующем примере создается маршрут к службе //Adventure-Works.com/Expenses. Срок жизни маршрута равен 259200 секундам, что составляет 72 часа.

CREATE ROUTE ExpenseRoute
    WITH
    SERVICE_NAME = '//Adventure-Works.com/Expenses',
    LIFETIME = 259200,
    ADDRESS = 'TCP://services.Adventure-Works.com:1234' ;

Ж. Создание маршрута к зеркальной базе данных

В следующем примере создается маршрут к службе //Adventure-Works.com/Expenses. Эта служба размещена на зеркальной базе данных. Одна из зеркальных баз данных расположена по адресу services.Adventure-Works.com:1234, вторая — по адресу services-mirror.Adventure-Works.com:1234.

CREATE ROUTE ExpenseRoute
    WITH
    SERVICE_NAME = '//Adventure-Works.com/Expenses',
    BROKER_INSTANCE = '69fcc80c-2239-4700-8437-1001ecddf933',
    ADDRESS = 'TCP://services.Adventure-Works.com:1234', 
    MIRROR_ADDRESS = 'TCP://services-mirror.Adventure-Works.com:1234' ;

З. Создание маршрута, использующего для маршрутизации имя службы

В следующем примере создается маршрут, который использует имя службы для определения сетевого адреса, на который будут отправляться сообщения. Обратите внимание, что маршрут, указывающий 'TRANSPORT' в качестве сетевого адреса, имеет более низкий приоритет совпадения, чем другие маршруты.

CREATE ROUTE TransportRoute
    WITH ADDRESS = 'TRANSPORT' ;