CREATE ROUTE (Transact-SQL)

Fügt der Routingtabelle der aktuellen Datenbank eine neue Route hinzu. Bei ausgehenden Nachrichten bestimmt Service Broker das Routing durch eine Prüfung der Routingtabelle in der lokalen Datenbank. Bei Nachrichten in Konversationen, die aus einer anderen Instanz stammen, sowie bei Nachrichten, die weitergeleitet werden sollen, prüft Service Broker die Routen in msdb.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

  • route_name
    Der Name der zu erstellenden Route. Eine neue Route wird in der aktuellen Datenbank erstellt. Ihr Besitzer ist der in der AUTHORIZATION-Klausel angegebene Prinzipal. Die Namen von Servern, Datenbanken und Schemas können nicht angegeben werden. route_name muss eine gültige Angabe für sysname sein.

  • AUTHORIZATION owner_name
    Legt den Benutzer oder die Rolle der angegebenen Datenbank als Besitzer der Route fest. Für owner_name kann der Name eines beliebigen gültigen Benutzers oder einer beliebigen Rolle verwendet werden, wenn der aktuelle Benutzer Mitglied der festen Datenbankrolle db_owner oder der festen Serverrolle sysadmin ist. Andernfalls muss owner_name der Name des aktuellen Benutzers, der Name eines Benutzers, für den der aktuelle Benutzer die IMPERSONATE-Berechtigung besitzt, oder der Name einer Rolle sein, der der aktuelle Benutzer angehört. Wird diese Klausel weggelassen, gehört die Route dem aktuellen Benutzer.

  • WITH
    Führt die Klauseln ein, über die die zurzeit erstellte Route definiert wird.

  • SERVICE_NAME = 'service_name'
    Gibt den Namen des Remotediensts an, auf den diese Route zeigt. service_name muss genau mit dem Namen übereinstimmen, den der Remotedienst verwendet. Service Broker verwendet einen Vergleich auf Byteebene, um eine Übereinstimmung für service_name festzustellen. Anders ausgedrückt: Bei dem Vergleich wird die Groß-/Kleinschreibung beachtet, die aktuelle Sortierung hingegen wird nicht berücksichtigt. Wenn SERVICE_NAME weggelassen wird, stimmt die Route mit jedem Dienstnamen überein, weist jedoch eine niedrigere Übereinstimmungspriorität als eine Route auf, die SERVICE_NAME angibt. Bei einer Route mit dem Dienstnamen 'SQL/ServiceBroker/BrokerConfiguration' handelt es sich um eine Route zu einem Broker-Konfigurationsdienst. Eine Route zu diesem Dienst kann keine Broker-Instanz angeben.

  • BROKER_INSTANCE = 'broker_instance_identifier'
    Gibt die Datenbank an, auf der sich der Zieldienst befindet. Bei dem broker_instance_identifier-Parameter muss es sich um den Broker-Instanzbezeichner für die Remotedatenbank handeln, die durch das Ausführen der folgenden Abfrage in der ausgewählten Datenbank abgerufen werden kann:

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

    Wenn die BROKER_INSTANCE-Klausel weggelassen wird, stimmt diese Route mit jeder Broker-Instanz überein. Eine Route, die mit jeder Broker-Instanz übereinstimmt, weist eine höhere Übereinstimmungspriorität auf als Routen mit einer expliziten Broker-Instanz, wenn die Konversation keine Broker-Instanz angibt. Bei Konversationen, in denen eine Broker-Instanz angegeben wird, weist eine Route mit einer Broker-Instanz eine höhere Priorität auf als eine Route, die mit jeder Broker-Instanz übereinstimmt.

  • LIFETIME **=**route_lifetime
    Gibt an, wie lange (in Sekunden) SQL Server die Route in der Routingtabelle aufbewahrt. Am Ende ihrer Lebensdauer läuft die Route ab, und SQL Server berücksichtigt die Route nicht bei der Auswahl einer Route für eine neue Konversation. Wird diese Klausel ausgelassen, wird für route_lifetime der Wert NULL festgelegt, und die Route läuft nie ab.

  • ADDRESS ='next_hop_address'
    Gibt die Netzwerkadresse für diese Route an. next_hop_address gibt eine TCP/IP-Adresse mit folgendem Format an:

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

    Der angegebene Wert für port_number muss mit der Portnummer für den Service Broker-Endpunkt einer Instanz von SQL Server auf dem angegebenen Computer übereinstimmen. Dieser kann durch Ausführen der folgenden Abfrage in der ausgewählten Datenbank abgerufen werden:

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

    Wenn eine gespiegelte Datenbank für den Dienst als Host dient, müssen Sie MIRROR_ADDRESS auch für die andere Instanz angeben, für die eine gespiegelte Datenbank als Host dient. Andernfalls führt die Route kein Failover zum Spiegel durch.

    Gibt eine Route 'LOCAL' für next_hop_address an, wird die Nachricht an einen Dienst innerhalb der aktuellen Instanz von SQL Server übermittelt.

    Gibt eine Route 'TRANSPORT' für next_hop_address an, wird die Netzwerkadresse auf der Basis der Netzwerkadresse im Dienstnamen bestimmt. Eine Route, die 'TRANSPORT' angibt, kann keinen Dienstnamen und keine Broker-Instanz angeben.

  • MIRROR_ADDRESS ='next_hop_mirror_address'
    Gibt die Netzwerkadresse für eine gespiegelte Datenbank an, wobei next_hop_address als Host für die gespiegelte Datenbank dient. next_hop_mirror_address gibt eine TCP/IP-Adresse mit folgendem Format an:

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

    Der angegebene Wert für port_number muss mit der Portnummer für den Service Broker-Endpunkt einer Instanz von SQL Server auf dem angegebenen Computer übereinstimmen. Dieser kann durch Ausführen der folgenden Abfrage in der ausgewählten Datenbank abgerufen werden:

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

    Wenn MIRROR_ADDRESS angegeben wird, muss die Route die SERVICE_NAME-Klausel und die BROKER_INSTANCE-Klausel angeben. Eine Route, die 'LOCAL' oder 'TRANSPORT' für next_hop_address angibt, kann keine Spiegeladresse angeben.

Hinweise

Bei der Routingtabelle, in der die Routen gespeichert werden, handelt es sich um eine Metadatentabelle, die über die Katalogsicht sys.routes gelesen werden kann. Diese Katalogsicht kann nur durch CREATE ROUTE-, ALTER ROUTE- und DROP ROUTE-Anweisungen aktualisiert werden.

Standardmäßig enthält die Routingtabelle in jeder Benutzerdatenbank eine Route. Diese Route wird AutoCreatedLocal genannt. Die Route gibt 'LOCAL' für next_hop_address an und ordnet Dienstname und Broker-Instanzbezeichner zu.

Gibt eine Route 'TRANSPORT' für next_hop_address an, wird die Netzwerkadresse auf der Basis des Dienstnamens bestimmt. SQL Server kann erfolgreich Dienstnamen verarbeiten, die mit einer Netzwerkadresse in einem Format beginnen, das gültig für next_hop_address ist.

Die Routingtabelle kann eine beliebige Anzahl von Routen enthalten, die den gleichen Dienst, die gleiche Netzwerkadresse und Broker-Instanz-ID angeben. In diesem Fall wählt Service Broker eine Route mithilfe einer Prozedur aus, die entwickelt wurde, eine möglichst genaue Übereinstimmung zwischen den in der Konversation angegebenen Informationen und den Informationen in der Routingtabelle festzustellen. Weitere Informationen zur Vorgehensweise von Service Broker beim Auswählen einer Route finden Sie unter Service Broker-Routing.

Service Broker entfernt abgelaufene Routen nicht aus der Routingtabelle. Mit der ALTER ROUTE-Anweisung kann eine abgelaufene Route aktiviert werden.

Eine Route kann kein temporäres Objekt sein. Routennamen, die mit # beginnen, sind zulässig. Es handelt sich dabei jedoch um dauerhafte Objekte.

Berechtigungen

Über die Berechtigung zum Erstellen einer Route verfügen standardmäßig Mitglieder der festen Datenbankrollen db_ddladmin und db_owner sowie der festen Serverrolle sysadmin.

Beispiele

A. Erstellen einer TCP/IP-Route mithilfe eines DNS-Namens

Im folgenden Beispiel wird eine Route zum Dienst //Adventure-Works.com/Expenses erstellt. Über die Route wird angegeben, dass Nachrichten an diesen Dienst über TCP an Port 1234 auf dem Host übertragen werden, der durch den DNS-Namen www.Adventure-Works.com identifiziert wird. Der Zielserver leitet die Nachrichten bei ihrem Eingang an die Broker-Instanz weiter, die durch den eindeutigen Bezeichner D8D4D268-00A3-4C62-8F91-634B89C1E315 identifiziert wird.

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. Erstellen einer TCP/IP-Route mithilfe eines NetBIOS-Namens

Im folgenden Beispiel wird eine Route zum Dienst //Adventure-Works.com/Expenses erstellt. Über die Route wird angegeben, dass Nachrichten an diesen Dienst über TCP an Port 1234 auf dem Host übertragen werden, der durch den NetBIOS-Namen SERVER02 identifiziert wird. Beim Eintreffen leitet der Zielserver mit SQL Server die Nachricht an die Datenbankinstanz weiter, die durch den eindeutigen Bezeichner D8D4D268-00A3-4C62-8F91-634B89C1E315 identifiziert wird.

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

C. Erstellen einer TCP/IP-Route mithilfe einer IP-Adresse

Im folgenden Beispiel wird eine Route zum Dienst //Adventure-Works.com/Expenses erstellt. Über die Route wird angegeben, dass Nachrichten an diesen Dienst über TCP an Port 1234 auf dem Host mit der IP-Adresse 192.168.10.2 übertragen werden. Beim Eintreffen leitet der Zielserver mit SQL Server die Nachricht an die Broker-Instanz weiter, die durch den eindeutigen Bezeichner D8D4D268-00A3-4C62-8F91-634B89C1E315 identifiziert wird.

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. Erstellen einer Route zu einem Weiterleitungsbroker

Im folgenden Beispiel wird eine Route zum Weiterleitungsbroker auf dem Server dispatch.Adventure-Works.com erstellt. Da weder der Dienstname noch die Broker-Instanz-ID angegeben sind, verwendet SQL Server diese Route für Dienste, für die keine andere Route definiert ist. Weitere Informationen zum Routing finden Sie unter Service Broker-Routing.

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

E. Erstellen einer Route zu einem lokalen Dienst

Im folgenden Beispiel wird eine Route zum Dienst //Adventure-Works.com/LogRequests in der gleichen Instanz wie die Route erstellt.

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

F. Erstellen einer Route unter Angabe einer Lebensdauer

Im folgenden Beispiel wird eine Route zum Dienst //Adventure-Works.com/Expenses erstellt. Die Lebensdauer der Route beträgt 259200 Sekunden. Dies entspricht 72 Stunden.

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

G. Erstellen einer Route zu einer gespiegelten Datenbank

Im folgenden Beispiel wird eine Route zum Dienst //Adventure-Works.com/Expenses erstellt. Für den Dienst dient eine Datenbank als Host, die gespiegelt wird. Eine der gespiegelten Datenbanken besitzt die Adresse services.Adventure-Works.com:1234, und die andere Datenbank besitzt die Adresse 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. Erstellen einer Route, die den Dienstnamen für das Routing verwendet

Im folgenden Beispiel wird eine Route erstellt, die den Dienstnamen verwendet, um die Netzwerkadresse zu bestimmen, an die die Nachricht gesendet wird. Beachten Sie, dass eine Route, die 'TRANSPORT' als Netzwerkadresse angibt, eine niedrigere Priorität für Übereinstimmungen aufweist als andere Routen.

CREATE ROUTE TransportRoute
    WITH ADDRESS = 'TRANSPORT' ;