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


CREATE ROUTE (Transact-SQL)

Область применения: SQL Server Управляемый экземпляр SQL Azure

Добавляет новый маршрут к таблице маршрутов для текущей базы данных. Для исходящих сообщений 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, или именем роли, которой принадлежит текущий пользователь. Если это предложение опущено, то маршрут принадлежит текущему пользователю.

ВМЕСТЕ С
Представляет предложения, которые определяют создаваемый маршрут.

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'
Для Управляемого экземпляра SQL аргумент ADDRESS должен задавать локальный адрес.

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

TCP://{ dns_name | netbios_name | ip_address } :port_number

Указанный port_number должен соответствовать номеру порта для конечной точки 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 для другого экземпляра зеркальной базы данных. В противном случае он не будет учитываться в маршруте.

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

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

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

TCP://{ dns_name | netbios_name | ip_address } : port_number

Указанный port_number должен соответствовать номеру порта для конечной точки 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 не удаляет истекшие маршруты из таблицы маршрутизации. Маршрут с истекшим сроком можно активировать с помощью инструкции 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' ;  

B. Создание 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' ;  

C. Создание 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' ;  

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

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

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

F. Создание маршрута с заданным временем существования

В следующем примере создается маршрут к службе //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' ;  

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

В следующем примере создается маршрут к службе //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' ;  

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

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

CREATE ROUTE TransportRoute  
    WITH ADDRESS = 'TRANSPORT' ;  

См. также

ALTER ROUTE (Transact-SQL)
DROP ROUTE (Transact-SQL)
EVENTDATA (Transact-SQL)