Updategram 소개(SQLXML 4.0)

Updategram이나 OPENXML Transact-SQL 함수를 사용하여 Microsoft SQL Server에서 기존 XML 문서로 데이터베이스를 수정(삽입, 업데이트 또는 삭제)할 수 있습니다.

OPENXML 함수는 기존 XML 문서를 조각화하여 INSERT, UPDATE 또는 DELETE 문에 전달할 수 있는 행 집합을 제공함으로써 데이터베이스를 수정합니다. OPENXML을 사용하면 작업이 데이터베이스 테이블에 대해 직접 수행되기 때문에 OPENXML은 테이블과 같은 행 집합 공급자를 원본으로 표시할 수 있는 경우에 가장 적합합니다.

OPENXML과 마찬가지로 updategram을 사용하면 데이터베이스에서 데이터를 삽입, 업데이트 또는 삭제할 수 있습니다. 그러나 updategram은 주석 XSD(또는 XDR) 스키마에서 제공하는 XML 뷰에 대해 작업을 수행합니다. 예를 들면 매핑 스키마에서 제공하는 XML 뷰에 업데이트가 적용됩니다. 매핑 스키마에는 XML 요소와 특성을 해당 데이터베이스 테이블과 열에 매핑하는 데 필요한 정보가 있으며 updategram은 이 매핑 정보를 사용하여 데이터베이스 테이블과 열을 업데이트합니다.

[!참고]

이 설명서에서는 사용자가 SQL Server 의 템플릿 및 매핑 스키마 지원에 대해 잘 알고 있다고 가정합니다. 자세한 내용은 주석이 추가된 XSD 스키마 소개(SQLXML 4.0)을 참조하십시오. XDR을 사용하는 레거시 응용 프로그램에 대해서는 주석이 추가된 XDR 스키마(SQLXML 4.0에서는 더 이상 사용되지 않음)를 참조하십시오.

Updategram의 필수 네임스페이스

<sync>, <before> 및 <after>와 같은 updategram 키워드는 urn:schemas-microsoft-com:xml-updategram 네임스페이스에 있으며 임의의 네임스페이스 접두사를 사용합니다. 이 설명서에서 updg 접두사는 updategram 네임스페이스를 나타냅니다.

구문 검토

Updategram은 updategram의 구문을 구성하는 <sync>, <before> 및 <after> 블록이 들어 있는 템플릿입니다. 다음 코드에서는 가장 간단한 형태의 updategram 구문을 보여 줍니다.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync [mapping-schema= "AnnotatedSchemaFile.xml"] >
    <updg:before>
        ...
    </updg:before>
    <updg:after>
        ...
    </updg:after>
  </updg:sync>
</ROOT>

다음 정의는 각 블록의 역할에 대해 설명합니다.

  • <before>
    레코드 인스턴스의 기존 상태("이전 상태"라고도 함)를 식별합니다.

  • <after>
    데이터가 변경될 새 상태를 식별합니다.

  • <sync>
    <before> 블록과 <after> 블록을 포함합니다. <sync> 블록에는 두 개 이상의 <before> 및 <after> 블록 집합이 포함될 수 있습니다. 두 개 이상의 <before> 및 <after> 블록 집합이 있으면 블록이 비어 있는 경우에도 이러한 블록을 쌍으로 지정해야 합니다. 또한 updategram에는 <sync> 블록이 두 개 이상 있을 수 있습니다. 각 <sync> 블록은 하나의 트랜잭션 단위이며, 이는 <sync> 블록의 모든 요소가 처리되거나 아무 요소도 처리되지 않음을 의미합니다. Updategram에 <sync> 블록을 여러 개 지정한 경우 <sync> 블록 하나가 실패해도 다른 <sync> 블록이 영향을 받지 않습니다.

Updategram은 다음과 같이 <before> 및 <after> 블록의 내용에 따라 레코드 인스턴스를 삭제, 삽입 또는 업데이트합니다.

  • 레코드 인스턴스가 <before> 블록에만 나타나고 <after> 블록에는 해당 인스턴스가 없으면 updategram이 삭제 작업을 수행합니다.

  • 레코드 인스턴스가 <after> 블록에만 나타나고 <before> 블록에는 해당 인스턴스가 없으면 updategram이 삽입 작업을 수행합니다.

  • 레코드 인스턴스가 <before> 블록에 나타나고 <after> 블록에도 해당 인스턴스가 있으면 업데이트 작업이 수행됩니다. 이 경우 updategram은 레코드 인스턴스를 <after> 블록에 지정된 값으로 업데이트합니다.

Updategram에 매핑 스키마 지정

Updategram에는 매핑 스키마(XSD 및 XDR 스키마 모두 지원됨)에서 제공하는 XML 추상화를 암시적 또는 명시적으로 지정할 수 있습니다. 즉, updategram은 매핑 스키마가 지정되었는지 여부에 관계없이 작업을 수행할 수 있습니다. 매핑 스키마를 지정하지 않으면 updategram은 <before> 블록이나 <after> 블록의 각 요소가 테이블에 매핑되고 각 요소의 자식 요소나 특성이 데이터베이스의 열에 매핑되는 암시적 매핑(기본 매핑)을 사용합니다. 매핑 스키마를 명시적으로 지정할 경우에는 updategram의 요소 및 특성이 매핑 스키마의 요소 및 특성과 일치해야 합니다.

암시적(기본) 매핑

일반적으로 간단한 업데이트를 수행하는 updategram에는 매핑 스키마가 필요하지 않습니다. 이 경우에는 기본 매핑 스키마가 사용됩니다.

다음 updategram은 암시적 매핑을 보여 줍니다. 이 예에서 updategram은 Sales.Customer 테이블에 새 고객을 추가합니다. 이 updategram은 암시적 매핑을 사용하기 때문에 <Sales.Customer> 요소는 Sales.Customer 테이블에 매핑되고 CustomerID 및 SalesPersonID 특성은 Sales.Customer 테이블의 해당 열에 매핑됩니다.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
    <Sales.Customer CustomerID="1" SalesPersonID="277" />
    </updg:after>
</updg:sync>
</ROOT>

명시적 매핑

매핑 스키마(XSD 또는 XDR)를 지정하면 updategram은 이 스키마를 사용하여 업데이트할 대상 데이터베이스 테이블과 열을 결정합니다.

Updategram으로 복잡한 업데이트를 수행하는 경우, 예를 들면 매핑 스키마에 지정된 부모-자식 관계를 기준으로 여러 테이블에 레코드를 삽입하는 경우에는 updategram이 실행되는 대상 mapping-schema 특성을 사용하여 매핑 스키마를 명시적으로 제공해야 합니다.

Updategram은 템플릿이기 때문에 updategram의 매핑 스키마에 대해 지정된 경로는 템플릿 파일의 위치(updategram이 저장된 위치)를 기준으로 합니다. 자세한 내용은 Updategram에 주석이 추가된 매핑 스키마 지정(SQLXML 4.0)을 참조하십시오.

Updategram의 요소 중심 및 특성 중심 매핑

Updategram에 매핑 스키마가 지정되지 않은 기본 매핑의 경우 updategram 요소는 테이블에 매핑되고 자식 요소(요소 중심 매핑)와 특성(특성 중심 매핑)은 열에 매핑됩니다.

요소 중심 매핑

요소 중심 updategram의 경우 요소에는 요소의 속성을 나타내는 자식 요소가 포함됩니다. 한 가지 예로 다음 updategram을 참조하십시오. <Person.Contact> 요소는 <FirstName><LastName> 자식 요소를 포함하고, 이러한 자식 요소는 <Person.Contact> 요소의 속성입니다.

이 updategram에는 매핑 스키마가 지정되지 않았기 때문에 <Person.Contact> 요소가 Person.Contact 테이블에 매핑되고 이 요소의 자식 요소가 FirstName 및 LastName 열에 매핑되는 암시적 매핑이 사용됩니다.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:after>
    <Person.Contact>
       <FirstName>Catherine</FirstName>
       <LastName>Abel</LastName>
    </Person.Contact>
  </updg:after>
</updg:sync>
</ROOT>

특성 중심 매핑

특성 중심 매핑에서는 요소가 특성을 포함합니다. 다음 updategram은 특성 중심 매핑을 사용합니다. 이 예에서 <Person.Contact> 요소는 FirstNameLastName 특성으로 구성되며 이러한 특성은 <Person.Contact> 요소의 속성입니다. 위의 예와 마찬가지로 이 updategram에는 매핑 스키마가 지정되지 않았기 때문에 암시적 매핑을 통해 <Person.Contact> 요소가 Person.Contact 테이블에 매핑되고 요소의 특성이 테이블의 해당 열에 매핑됩니다.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:before>
  </updg:before>
  <updg:after>
    <Person.Contact FirstName="Catherine" LastName="Abel" />
  </updg:after>
</updg:sync>
</ROOT>

요소 중심 및 특성 중심 매핑 모두 사용

다음 updategram과 같이 요소 중심 및 특성 중심 매핑을 혼합하여 지정할 수 있습니다. 이 예에서 <Person.Contact> 요소에는 특성과 자식 요소가 모두 있습니다. 또한 이 updategram에는 암시적 매핑이 사용됩니다. 따라서 FirstName 특성과 <LastName> 자식 요소는 Person.Contact 테이블의 해당 열에 매핑됩니다.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:before>
  </updg:before>
  <updg:after>
    <Person.Contact FirstName="Catherine" >
       <LastName>Abel</LastName>
    </Person.Contact>
  </updg:after>
</updg:sync>
</ROOT>

SQL Server에서는 유효하지만 XML에서는 유효하지 않은 문자 사용

SQL Server에서는 테이블 이름에 공백이 포함될 수 있지만 이러한 형식의 테이블 이름은 XML에서는 유효하지 않습니다.

SQL Server에서는 유효하지만 XML에서는 유효하지 않은 문자 식별자를 인코딩하려면 '__xHHHH__'를 인코딩 값으로 사용할 수 있습니다. 여기서 HHHH는 해당 문자에 대한 최상위 비트 우선 순서의 4자리 16진수 UCS-2 코드를 나타냅니다. 이 인코딩 방식을 사용하면 공백 문자가 x0020(공백 문자의 4자리 16진수 코드)으로 바뀌기 때문에 SQL Server의 [Order Details]라는 테이블 이름이 XML에서는 _x005B_Order_x0020_Details_x005D_가 됩니다.

마찬가지로 <[database].[owner].[table]>과 같이 세 부분으로 구성된 요소 이름을 지정해야 할 수 있습니다. 대괄호 문자([ 및 ])는 XML에서는 유효하지 않기 때문에 이 이름을 <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>로 지정해야 합니다. 여기서 _x005B_는 왼쪽 대괄호([)에 대한 인코딩이고 _x005D_는 오른쪽 대괄호(])에 대한 인코딩입니다.

Updategram 실행

Updategram은 템플릿이기 때문에 템플릿의 모든 처리 메커니즘이 적용됩니다. SQLXML 4.0에서는 다음 방법 중 하나로 updategram을 실행할 수 있습니다.

  • ADO 명령으로 전송

  • OLE DB 명령으로 전송

참고 항목

참조

Updategram 보안 고려 사항(SQLXML 4.0)