次の方法で共有


アップデートグラムでの注釈付きマッピング スキーマの指定 (SQLXML 4.0)

ここでは、アップデートグラムで指定したマッピング スキーマ (XSD または XDR) が、更新の処理にどのように使用されるかについて説明します。 アップデートグラムでは、注釈付きマッピング スキーマの名前を指定でき、アップデートグラム内の要素と属性を Microsoft SQL Server 内のテーブルと列にマッピングするときに使用できます。 アップデートグラムでマッピング スキーマを指定する場合、アップデートグラムで指定する要素と属性名は、マッピング スキーマ内の要素と属性にマップされる必要があります。

マッピング スキーマを指定するには、<sync> 要素の mapping-schema 属性を使用します。 次の例では、単純なマッピング スキーマを使用するアップデートグラムと、より複雑なスキーマを使用するアップデートグラムの 2 つのアップデートグラムを示します。

注意

このドキュメントは、SQL Server でサポートされるテンプレートとマッピング スキーマについて理解していることを前提としています。 詳細については、「注釈付き XSD スキーマの概要 (SQLXML 4.0)」を参照してください。 XDR を使用するレガシ アプリケーションについては、「注釈付き XDR スキーマ (SQLXML 4.0 では非推奨)」を参照してください。

データ型の扱い

スキーマで (sql:datatype を使用して) image、binary、または varbinary の SQL Server データ型を指定し、XML データ型を指定しない場合、アップデートグラムでは XML データ型が binary base 64 であると想定されます。 データが bin.base 型の場合は、明示的に型 (dt:type=bin.base または type="xsd:hexBinary") を指定する必要があります。

dateTime、date、または time の XSD データ型を指定する場合は、sql:datatype="dateTime" を使用して、対応する SQL Server データ型も指定する必要があります。

SQL Server の money 型のパラメーターを扱う場合は、マッピング スキーマ内の適切なノードに sql:datatype="money" を明示的に指定する必要があります。

使用例

次の例を使用した実際のサンプルを作成するには、「SQLXML のサンプル実行のための必要条件」で指定される条件を満たす必要があります。

A. 単純なマッピング スキーマを使用するアップデートグラムを作成する

次の XSD スキーマ (SampleSchema.xml) は、<Customer> 要素を Sales.Customer テーブルにマップするマッピング スキーマです。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:element name="Customer" sql:relation="Sales.Customer" >
   <xsd:complexType>
        <xsd:attribute name="CustID"  
                       sql:field="CustomerID" 
                       type="xsd:string" />
        <xsd:attribute name="RegionID"  
                       sql:field="TerritoryID"  
                       type="xsd:string" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

次のアップデートグラムでは、Sales.Customer テーブルにレコードを挿入します。ここでは上のマッピング スキーマに従って、このデータをテーブルに適切にマップします。 このアップデートグラムでは、スキーマで定義されている要素と同じ要素名 <Customer> を使用することに注意してください。 アップデートグラムで特定のスキーマを指定するときには、これが必須となります。

アップデートグラムをテストするには

  1. 上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、 SampleUpdateSchema.xml として保存します。

  2. 下のアップデートグラムのテンプレートをコピーして、テキスト ファイルに貼り付け、 SampleUpdateSchema.xml を保存したディレクトリに SampleUpdategram.xml として保存します。

    <ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
      <updg:sync mapping-schema="SampleUpdateSchema.xml">
        <updg:before>
          <Customer CustID="1" RegionID="1"  />
        </updg:before>
        <updg:after>
          <Customer CustID="1" RegionID="2" />
        </updg:after>
      </updg:sync>
    </ROOT>
    

    マッピング スキーマ (SampleUpdateSchema.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。 次のように、絶対パスを指定することもできます。

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
    
  3. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

    詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

XDR スキーマの場合は次のようになります。

<?xml version="1.0" ?>
   <Schema xmlns="urn:schemas-microsoft-com:xml-data" 
         xmlns:dt="urn:schemas-microsoft-com:datatypes" 
         xmlns:sql="urn:schemas-microsoft-com:xml-sql">
     <ElementType name="Customer" sql:relation="Sales.Customer" >
       <AttributeType name="CustID" />
       <AttributeType name="RegionID" />

       <attribute type="CustID" sql:field="CustomerID" />
       <attribute type="RegionID" sql:field="TerritoryID" />
     </ElementType>
   </Schema> 

B. マッピング スキーマに指定されている親子リレーションシップを使用して、レコードを挿入する

スキーマ要素は関連付けることができます。 <sql:relationship> 要素では、スキーマ要素間の親子リレーションシップを指定します。 この情報は、主キー/外部キーのリレーションシップがある対応するテーブルを更新するときに使用されます。

次のマッピング スキーマ (SampleSchema.xml) は、<Order><OD> の 2 つの要素で構成されています。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
  <xsd:appinfo>
    <sql:relationship name="OrderOD"
          parent="Sales.SalesOrderHeader"
          parent-key="SalesOrderID"
          child="Sales.SalesOrderDetail"
          child-key="SalesOrderID" />
  </xsd:appinfo>
</xsd:annotation>

  <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" >
   <xsd:complexType>
     <xsd:sequence>
        <xsd:element name="OD" 
                     sql:relation="Sales.SalesOrderDetail"
                     sql:relationship="OrderOD" >
           <xsd:complexType>
              <xsd:attribute name="SalesOrderID"   type="xsd:integer" />
              <xsd:attribute name="ProductID" type="xsd:integer" />
             <xsd:attribute name="UnitPrice"  type="xsd:decimal" />
             <xsd:attribute name="OrderQty"   type="xsd:integer" />
             <xsd:attribute name="UnitPriceDiscount"   type="xsd:decimal" />

           </xsd:complexType>
        </xsd:element>
     </xsd:sequence>
        <xsd:attribute name="CustomerID"   type="xsd:string" /> 
        <xsd:attribute name="SalesOrderID"  type="xsd:integer" />
        <xsd:attribute name="OrderDate"  type="xsd:date" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

次のアップデートグラムでは、この XSD スキーマを使用して、注文 43860 の新しい注文明細レコード (<after> ブロック内の <OD> 要素) を追加します。 mapping-schema 属性は、アップデートグラム内でマッピング スキーマを指定するために使用されます。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync mapping-schema="SampleUpdateSchema.xml" >
    <updg:before>
       <Order SalesOrderID="43860" />
    </updg:before>
    <updg:after>
      <Order SalesOrderID="43860" >
           <OD ProductID="753" UnitPrice="$10.00"
               Quantity="5" Discount="0.0" />
      </Order>
    </updg:after>
  </updg:sync>
</ROOT>

アップデートグラムをテストするには

  1. 上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、 SampleUpdateSchema.xml として保存します。

  2. 上のアップデートグラムのテンプレートをコピーして、テキスト ファイルに貼り付け、 SampleUpdateSchema.xml を保存したディレクトリに SampleUpdategram.xml として保存します。

    マッピング スキーマ (SampleUpdateSchema.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。 次のように、絶対パスを指定することもできます。

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
    
  3. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

    詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

XDR スキーマの場合は次のようになります。

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<ElementType name="OD" sql:relation="Sales.SalesOrderDetail" >
    <AttributeType name="SalesOrderID" />
    <AttributeType name="ProductID" />
    <AttributeType name="UnitPrice"  dt:type="fixed.14.4" />
    <AttributeType name="OrderQty" />
    <AttributeType name="UnitPriceDiscount" />

    <attribute type="SalesOrderID" />
    <attribute type="ProductID" />
    <attribute type="UnitPrice" />
    <attribute type="OrderQty" />
    <attribute type="UnitPriceDiscount" />
</ElementType>

<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
    <AttributeType name="CustomerID" />
    <AttributeType name="SalesOrderID" />
    <AttributeType name="OrderDate" />

    <attribute type="CustomerID" />
    <attribute type="SalesOrderID" />
    <attribute type="OrderDate" />
    <element type="OD" >
             <sql:relationship 
                   key-relation="Sales.SalesOrderHeader"
                   key="SalesOrderID"
                   foreign-key="SalesOrderID"
                   foreign-relation="Sales.SalesOrderDetail" />
    </element>
</ElementType>
</Schema>

C. XSD スキーマで指定されている親子リレーションシップと inverse 注釈を使用して、レコードを挿入する

この例では、XSD で指定される親子リレーションシップがアップデートグラム ロジックでどのように使用され、更新が処理されるかと、inverse 注釈がどのように使用されるかを示します。 inverse 注釈の詳細については、「sql:relationship での sql:inverse 属性の指定 (SQLXML 4.0)」を参照してください。

この例では、次のテーブルが tempdb データベース内にあることを想定しています。

  • Cust (CustomerID, CompanyName)。ここでは CustomerID は主キーです。

  • Ord (OrderID, CustomerID)。ここでは CustomerID は外部キーで、Cust テーブル内の CustomerID 主キーを参照します。

このアップデートグラムでは次の XSD スキーマを使用して、Cust および Ord テーブルにレコードを挿入します。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
  <xsd:appinfo>
       <sql:relationship name="OrdCust" inverse="true"
                  parent="Ord"
                  parent-key="CustomerID"
                  child-key="CustomerID"
                  child="Cust"/>
  </xsd:appinfo>
</xsd:annotation>

<xsd:element name="Order" sql:relation="Ord">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element ref="Customer" sql:relationship="OrdCust"/>
    </xsd:sequence>
    <xsd:attribute name="OrderID"   type="xsd:int"/>
    <xsd:attribute name="CustomerID" type="xsd:string"/>
  </xsd:complexType>
</xsd:element>

<xsd:element name="Customer" sql:relation="Cust">
  <xsd:complexType>
     <xsd:attribute name="CustomerID"  type="xsd:string"/>
    <xsd:attribute name="CompanyName" type="xsd:string"/>
  </xsd:complexType>
</xsd:element>

</xsd:schema>

この例の XSD スキーマには、<Customer><Order> の 2 つの要素が含まれています。スキーマ内ではこれらの親子リレーションシップが指定され、 <Order> は親要素、<Customer> は子要素として識別されています。

アップデートグラム処理ロジックでは、親子リレーションシップに関する情報に基づいて、レコードがテーブルに挿入される順序が決定されます。 この例では、<Order> が親であるため、アップデートグラム ロジックによって最初に Ord テーブルへのレコード挿入が試行されます。次に、<Customer> が子であるため、Cust テーブルへのレコード挿入が試行されます。 しかし、データベース テーブル スキーマに含まれる主キー/外部キーの情報に対して、この挿入操作はデータベースの外部キー違反となるため、挿入は失敗します。

アップデートグラム ロジックに対し、更新操作中に親子リレーションシップを逆にするよう指示するには、<relationship> 要素に inverse 注釈を指定します。 こうすると、最初に Cust テーブル、次に Ord テーブルにレコードが追加され、操作は成功します。

次のアップデートグラムでは、指定された XSD スキーマを使用して、Ord テーブルに注文 (OrderID=2)、Cust テーブルに顧客 (CustomerID='AAAAA') を挿入します。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync mapping-schema="SampleUpdateSchema.xml" >
    <updg:before/>
    <updg:after>
      <Order OrderID="2" CustomerID="AAAAA" >
        <Customer CustomerID="AAAAA" CompanyName="AAAAA Company" />
      </Order>
    </updg:after>
  </updg:sync>
</ROOT>

アップデートグラムをテストするには

  1. tempdb データベース内に次のテーブルを作成します。

    USE tempdb
    CREATE TABLE Cust(CustomerID varchar(5) primary key, 
                      CompanyName varchar(20))
    GO
    CREATE TABLE Ord (OrderID int primary key, 
                      CustomerID varchar(5) references Cust(CustomerID))
    GO
    
  2. 上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、 SampleUpdateSchema.xml として保存します。

  3. 上のアップデートグラムのテンプレートをコピーして、テキスト ファイルに貼り付け、 SampleUpdateSchema.xml を保存したディレクトリに SampleUpdategram.xml として保存します。

    マッピング スキーマ (SampleUpdateSchema.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。 次のように、絶対パスを指定することもできます。

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
    
  4. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

    詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

関連項目

参照

アップデートグラムのセキュリティに関する注意点 (SQLXML 4.0)