Condividi tramite


CREATE CONTRACT (Transact-SQL)

Crea un nuovo contratto. Un contratto definisce i tipi di messaggio utilizzati in una conversazione di Service Broker, nonché il lato della conversazione che può inviare messaggi di tale tipo. Ogni conversazione viene eseguita in base a un contratto. Il servizio di origine specifica il contratto per la conversazione all'inizio della conversazione stessa, mentre il servizio target specifica i contratti accettati per le conversazioni.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

CREATE CONTRACT contract_name
   [ AUTHORIZATION owner_name ]
      (  {   { message_type_name | [ DEFAULT ] }
          SENT BY { INITIATOR | TARGET | ANY } 
       } [ ,...n] ) 
[ ; ]

Argomenti

  • contract_name
    Nome del contratto da creare. Il nuovo contratto viene creato nel database corrente e diventa di proprietà dell'identità specificata nella clausola AUTHORIZATION. Non è possibile specificare i nomi del server, del database e dello schema. Il valore di contract_name può contenere al massimo 128 caratteri.
  • AUTHORIZATION owner_name
    Imposta come proprietario del contratto l'utente o il ruolo del database specificato. Se l'utente corrente è dbo o sa, owner_name può essere il nome di qualsiasi utente o ruolo valido. In caso contrario, owner_name deve essere il nome dell'utente corrente, il nome di un utente per il quale l'utente corrente dispone di autorizzazioni di rappresentazione oppure il nome di un ruolo a cui appartiene l'utente corrente. Se la clausola viene omessa, il contratto appartiene all'utente corrente.
  • message_type_name
    Nome del tipo di messaggio da includere nel contratto.
  • SENT BY
    Specifica l'endpoint che può inviare un messaggio del tipo indicato. I contratti documentano i messaggi che i servizi possono utilizzare per eseguire conversazioni specifiche. Ogni conversazione è caratterizzata da due endpoint, l'endpoint initiator (il servizio che ha avviato la conversazione) e l'endpoint target (il servizio che l'endpoint initiator sta contattando).
  • INITIATOR
    Indica che solo l'endpoint initiator della conversazione può inviare messaggi del tipo specificato. Un servizio che inizia una conversazione viene definito initiator della conversazione.
  • TARGET
    Indica che solo l'endpoint target della conversazione può inviare messaggi del tipo specificato. Un servizio che accetta una conversazione avviata da un altro servizio viene definito target della conversazione.
  • ANY
    Indica che i messaggi del tipo specificato possono essere inviati sia dal servizio initiator che dal servizio target.
  • [ DEFAULT ]
    Indica che il contratto supporta messaggi del tipo predefinito. Per impostazione predefinita, tutti i database contengono un tipo di messaggio denominato DEFAULT. Questo tipo di messaggio utilizza la convalida di tipo NONE. Nel contesto di questa clausola, DEFAULT non è una parola chiave e deve essere delimitata come un identificatore. MicrosoftSQL Server fornisce anche un contratto DEFAULT che specifica il tipo di messaggio predefinito.

Osservazioni

L'ordine dei tipi di messaggio nel contratto non è significativo. Dopo che il servizio target ha ricevuto il primo messaggio, Service Broker consente ai lati della conversazione di inviare qualsiasi messaggio consentito al lato specifico della conversazione. Se, ad esempio, il servizio initiator della conversazione può inviare messaggi di tipo //Adventure-Works.com/Expenses/SubmitExpense, Service Broker consente a tale servizio di inviare un numero qualsiasi di messaggi SubmitExpense in qualsiasi momento durante la conversazione.

In un contratto non è possibile modificare i tipi di messaggio e la direzione dei messaggi. Per modificare il parametro AUTHORIZATION per un contratto, utilizzare l'istruzione ALTER AUTHORIZATION.

Un contratto deve consentire al servizio initiator di inviare un messaggio. L'istruzione CREATE CONTRACT ha esito negativo se il contratto non include almeno un tipo di messaggio SENT BY ANY o SENT BY INITIATOR.

Indipendentemente dal contratto, un servizio può sempre ricevere i tipi di messaggio https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer, https://schemas.microsoft.com/SQL/ServiceBroker/Error e https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog. Service Broker utilizza questi tipi di messaggi per i messaggi di sistema all'applicazione. Per ulteriori informazioni sui tipi di messaggio di Service Broker, vedere Messaggi di Service Broker.

Un contratto può non essere un oggetto temporaneo. Sono consentiti i nomi di contratto che iniziano con #, ma in questo caso si tratta di oggetti permanenti.

Autorizzazioni

Per impostazione predefinita, i membri del ruolo predefinito del database db_ddladmin o db_owner e del ruolo predefinito del server sysadmin possono creare contratti.

Per impostazione predefinita, il proprietario del contratto, i membri del ruolo predefinito del database db_ddladmin o db_owner e i membri del ruolo predefinito del server sysadmin dispongono dell'autorizzazione REFERENCES per un contratto.

L'utente che esegue l'istruzione CREATE CONTRACT deve disporre dell'autorizzazione REFERENCES per tutti i tipi di messaggio specificati.

Esempi

A. Creazione di un contratto

Nell'esempio seguente viene creato un contratto per il rimborso spese in base a tre tipi di messaggio.

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

Vedere anche

Riferimento

DROP CONTRACT (Transact-SQL)
EVENTDATA (Transact-SQL)

Altre risorse

Contratti
Tipi di messaggi
Esercitazioni su Service Broker

Guida in linea e informazioni

Assistenza su SQL Server 2005