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