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

適用対象: SQL Server Azure SQL Database

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

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

Note

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

データ型の扱い

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

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

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

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

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 の新しい注文詳細レコード ( <OD> 要素を <after> ブロック) に追加します。 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 (SQLXML 4.0)の sql:inverse 属性の指定」を参照してください。

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

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

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

このアップデートグラムでは次の 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>を子要素として識別します。

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

更新操作中に親子関係を逆にするようにアップデートグラム ロジックに指示するために、 inverse 注釈は <relationship> 要素で指定されます。 こうすると、最初に 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)