CREATE CONTRACT (Transact-SQL)
Gilt für: SQL Server Azure SQL Managed Instance
Erstellt einen neuen Vertrag. Ein Vertrag definiert die in einer Service Broker-Konversation verwendeten Nachrichtentypen und legt fest, welche Seite der Konversation Nachrichten eines bestimmten Typs senden kann. Jede Konversation folgt einem Vertrag. Der initiierende Dienst gibt beim Start der Konversation den Vertrag für die Konversation an. Der Zieldienst gibt die Verträge an, für die der Zieldienst Konversationen annimmt.
Transact-SQL-Syntaxkonventionen
Syntax
CREATE CONTRACT contract_name
[ AUTHORIZATION owner_name ]
( { { message_type_name | [ DEFAULT ] }
SENT BY { INITIATOR | TARGET | ANY }
} [ ,...n] )
[ ; ]
Argumente
contract_name
Der Name des zu erstellenden Vertrags. Ein neuer Vertrag wird in der aktuellen Datenbank erstellt; der Besitzer ist der in der AUTHORIZATION-Klausel angegebene Prinzipal. Server-, Datenbank- und Schemaname können nicht angegeben werden. contract_name kann aus bis zu 128 Zeichen bestehen.
Hinweis
Erstellen Sie keinen Vertrag, der das Schlüsselwort ANY für contract_name verwendet. Wenn Sie in CREATE BROKER PRIORITY für einen Vertragsnamen ANY angeben, wird die Priorität für alle Verträge berücksichtigt. ANY steht nicht nur für einen Vertrag mit dem Namen ANY.
AUTHORIZATION owner_name
Legt den Besitzer des Vertrags auf den angegebenen Datenbankbenutzer oder die angegebene Datenbankrolle fest. Ist der aktuelle Benutzer dbo oder sa, kann owner_name der Name eines beliebigen gültigen Benutzers bzw. einer beliebigen gültigen Rolle sein. Andernfalls muss owner_name der Name des aktuellen Benutzers, der Name eines Benutzers, für den der aktuelle Benutzer Identitätswechselberechtigungen besitzt, oder der Name einer Rolle sein, der der aktuelle Benutzer angehört. Wenn diese Klausel weggelassen wird, gehört der Vertrag dem aktuellen Benutzer.
message_type_name
Der Name eines in den Vertrag eingeschlossenen Nachrichtentyps.
SENT BY
Gibt an, welcher Endpunkt eine Nachricht vom angegebenen Nachrichtentyp senden kann. Verträge dokumentieren die Nachrichten, die von Diensten für bestimmte Konversationen verwendet werden können. Jede Konversation verfügt über zwei Endpunkte: den initiator-Endpunkt, wobei es sich um den Dienst handelt, der die Konversation gestartet hat, und den target-Endpunkt, wobei es sich um den Dienst handelt, mit dem der Initiator Kontakt aufnimmt.
INITIATOR
Gibt an, dass nur der Initiator der Konversation Nachrichten eines bestimmten Nachrichtentyps senden kann. Ein Dienst, der eine Konversation startet, wird als der Initiator der Konversation bezeichnet.
TARGET
Gibt an, dass nur das Ziel der Konversation Nachrichten eines bestimmten Nachrichtentyps senden kann. Ein Dienst, der eine von einem anderen Dienst begonnene Konversation annimmt, wird als das Ziel der Konversation bezeichnet.
ANY
Gibt an, dass Nachrichten dieses Typs sowohl vom Initiator als auch vom Ziel gesendet werden können.
[DEFAULT]
Gibt an, dass dieser Vertrag Nachrichten vom Standardnachrichtentyp unterstützt. Standardmäßig enthalten alle Datenbanken einen Nachrichtentyp namens DEFAULT. Dieser Nachrichtentyp verwendet NONE für die Überprüfung. Im Kontext dieser Klausel ist DEFAULT kein Schlüsselwort und muss als Bezeichner begrenzt sein. Microsoft SQL Server stellt auch einen DEFAULT-Vertrag bereit, der den Nachrichtentyp DEFAULT angibt.
Bemerkungen
Die Reihenfolge von Nachrichtentypen im Vertrag ist nicht von Bedeutung. Nachdem das Ziel die erste Nachricht erhalten hat, ermöglicht der Service Broker beiden Seiten der Konversation, zu jeder Zeit Nachrichten zu senden, die für die jeweilige Konversationsseite zulässig sind. Kann der Initiator der Konversation beispielsweise den Nachrichtentyp //Adventure-Works.com/Expenses/SubmitExpense senden, ermöglicht der Service Broker dem Initiator das Senden beliebig vieler SubmitExpense-Nachrichten zu jeder Zeit im Verlauf der Konversation.
Die Nachrichtentypen und -richtungen in einem Vertrag können nicht geändert werden. Verwenden Sie die ALTER AUTHORIZATION-Anweisung, wenn Sie den Wert von AUTHORIZATION für einen Vertrag ändern möchten.
Ein Vertrag muss dem Initiator das Senden einer Nachricht ermöglichen. Die CREATE CONTRACT-Anweisung erzeugt einen Fehler, wenn der Vertrag nicht zumindest den Nachrichtentyp SENT BY ANY oder SENT BY INITIATOR enthält.
Unabhängig vom Vertrag kann ein Dienst immer die Nachrichtentypen https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer
, https://schemas.microsoft.com/SQL/ServiceBroker/Error
und https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog
empfangen. Service Broker verwendet diese Nachrichtentypen für Systemnachrichten an die Anwendung.
Ein Vertrag kann kein temporäres Objekt sein. Vertragsnamen, die mit # beginnen, sind zulässig. Es handelt sich dabei jedoch um dauerhafte Objekte.
Berechtigungen
Standardmäßig können Mitglieder der festen Datenbankrolle db_ddladmin oder db_owner sowie der festen Serverrolle sysadmin Verträge erstellen.
Standardmäßig verfügen der Besitzer des Vertrags, Mitglieder der festen Datenbankrolle db_ddladmin oder db_owner sowie Mitglieder der festen Serverrolle sysadmin über die REFERENCES-Berechtigung für einen Vertrag.
Der Benutzer, der die CREATE CONTRACT-Anweisung ausführt, benötigt die REFERENCES-Berechtigung für alle angegebenen Nachrichtentypen.
Beispiele
A. Erstellen eines Vertrags
Im folgenden Beispiel wird ein Aufwandentschädigungsvertrag auf der Basis von drei Nachrichtentypen erstellt.
CREATE MESSAGE TYPE
[//Adventure-Works.com/Expenses/SubmitExpense]
VALIDATION = WELL_FORMED_XML ;
CREATE MESSAGE TYPE
[//Adventure-Works.com/Expenses/ExpenseApprovedOrDenied]
VALIDATION = WELL_FORMED_XML ;
CREATE MESSAGE TYPE
[//Adventure-Works.com/Expenses/ExpenseReimbursed]
VALIDATION= WELL_FORMED_XML ;
CREATE CONTRACT
[//Adventure-Works.com/Expenses/ExpenseSubmission]
( [//Adventure-Works.com/Expenses/SubmitExpense]
SENT BY INITIATOR,
[//Adventure-Works.com/Expenses/ExpenseApprovedOrDenied]
SENT BY TARGET,
[//Adventure-Works.com/Expenses/ExpenseReimbursed]
SENT BY TARGET
) ;