다음을 통해 공유


CREATE CONTRACT(Transact-SQL)

새 계약을 만듭니다. 계약은 Service Broker 대화에 사용되는 메시지 유형을 정의하며 해당 유형의 메시지를 보낼 수 있는 대화 상대도 결정합니다. 각 대화는 계약을 따릅니다. 시작 서비스는 대화가 시작될 때 대화에 대한 계약을 지정합니다. 대상 서비스는 대상 서비스가 받아들이는 대화에 대한 계약을 지정합니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

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

인수

  • contract_name
    만들 계약의 이름입니다. 새 계약은 현재 데이터베이스에 생성되고 AUTHORIZATION 절에서 지정한 보안 주체가 소유합니다. 서버, 데이터베이스 및 스키마 이름은 지정할 수 없습니다. contract_name은 최대 128자까지 지정할 수 있습니다.

    [!참고]

    contract_name에 ANY 키워드를 사용하는 계약을 만들지 마십시오. CREATE BROKER PRIORITY에서 계약 이름에 ANY를 지정하면 모든 계약에 대해 우선 순위가 고려됩니다. 이러한 규칙은 이름이 ANY인 계약으로 제한되지 않습니다.

  • AUTHORIZATION owner_name
    지정한 데이터베이스 사용자 또는 역할로 계약의 소유자를 설정합니다. 현재 사용자가 dbo 또는 sa일 경우 owner_name은 유효한 사용자 또는 역할의 이름일 수 있습니다. 그렇지 않으면 owner_name은 현재 사용자 이름, 현재 사용자가 권한을 가장한 사용자의 이름, 현재 사용자가 속한 역할 이름 중 하나여야 합니다. 이 절을 생략하면 계약이 현재 사용자에 속합니다.

  • message_type_name
    계약의 일부로 포함될 메시지 유형의 이름입니다.

  • SENT BY
    지정된 메시지 유형의 메시지를 보낼 수 있는 끝점을 지정합니다. 계약은 서비스에서 특정 대화를 소유하기 위해 사용할 수 있는 메시지를 문서화합니다. 대화마다 두 개의 끝점이 있는데 시작자 끝점은 대화를 시작한 서비스이고 대상 끝점은 시작자가 연결하고 있는 서비스입니다.

  • INITIATOR
    대화의 시작자만 지정된 메시지 유형의 메시지를 보낼 수 있음을 나타냅니다. 대화를 시작하는 서비스를 대화의 시작자라고 합니다.

  • TARGET
    대화의 대상만 지정된 메시지 유형의 메시지를 보낼 수 있음을 나타냅니다. 다른 서비스에서 시작된 대화를 받아들이는 서비스를 대화의 대상이라고 합니다.

  • ANY
    시작자와 대상 모두 이 유형의 메시지를 보낼 수 있음을 나타냅니다.

  • [DEFAULT]
    이 계약에서 기본 메시지 유형의 메시지를 지원함을 나타냅니다. 기본적으로 모든 데이터베이스에는 DEFAULT라는 메시지 유형이 있습니다. 이 메시지 유형은 유효성 검사 NONE을 사용합니다. 이 절의 컨텍스트에서 DEFAULT는 키워드가 아니므로 식별자로 구분해야 합니다. Microsoft SQL Server에서는 DEFAULT 메시지 유형을 지정하는 DEFAULT 계약도 제공합니다.

주의

계약에서 메시지 유형의 순서는 중요하지 않습니다. 대상이 첫 번째 메시지를 받으면 Service Broker는 대화 상대 중 어느 한 쪽이 언제든지 해당 대화 상대에 허용된 메시지를 보낼 수 있도록 허용합니다. 예를 들어 대화 시작자가 //Adventure-Works.com/Expenses/SubmitExpense 메시지 유형을 보낼 수 있는 경우 Service Broker는 시작자가 대화 중에 SubmitExpense 메시지를 얼마든지 보낼 수 있도록 허용합니다.

계약에서 메시지 유형과 방향은 변경할 수 없습니다. 계약에 대한 AUTHORIZATION을 변경하려면 ALTER AUTHORIZATION 문을 사용합니다.

계약은 시작자가 메시지를 보낼 수 있도록 허용해야 합니다. 계약이 하나 이상의 메시지 유형(SENT BY ANY 또는 SENT BY INITIATOR)을 포함하지 않으면 CREATE CONTRACT 문이 실패합니다.

계약과 관계없이 서비스는 항상 https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer, https://schemas.microsoft.com/SQL/ServiceBroker/Errorhttps://schemas.microsoft.com/SQL/ServiceBroker/EndDialog 메시지 유형을 받습니다. Service Broker에서는 응용 프로그램에 대한 시스템 메시지에 이러한 메시지 유형을 사용합니다. Broker에서 제공하는 메시지 유형에 대한 자세한 내용은 Broker 시스템 메시지를 참조하십시오.

계약은 임시 개체가 아닐 수 있습니다. #로 시작하는 계약 이름은 허용되지만 영구 개체입니다.

사용 권한

기본적으로 db_ddladmin 또는 db_owner 고정 데이터베이스 역할 및 sysadmin 고정 서버 역할의 멤버가 계약을 만들 수 있습니다.

또한 기본적으로 계약의 소유자, db_ddladmin 또는 db_owner 고정 데이터베이스 역할의 멤버 및 sysadmin 고정 서버 역할의 멤버에게는 계약에 대한 REFERENCES 권한이 있습니다.

CREATE CONTRACT 문을 실행하는 사용자에게는 지정된 모든 메시지 유형에 대한 REFERENCES 권한이 있어야 합니다.

1. 계약 만들기

다음 예에서는 세 메시지 유형을 기반으로 경비 변제 계약을 만듭니다.

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