Sdílet prostřednictvím


Specifikace anotovaného mapovacího schématu v aktualizačním gramu (SQLXML 4.0)

platí pro:SQL Serverazure SQL Database

Toto téma vysvětluje, jak se mapovací schéma (XSD nebo XDR), které je specifikováno v updategramu, používá ke zpracování aktualizací. V updategramu můžete zadat název anotovaného mapovacího schématu, které použijete při mapování prvků a atributů v updategramu do tabulek a sloupců v Microsoft SQL Serveru. Když je mapovací schéma specifikováno v updategramu, musí se jména prvků a atributů specifikovaná v updategramu mapovat na prvky a atributy v mapovacím schématu.

Pro specifikaci mapovacího schématu použijete atribut mapping-schemasynchronizačního prvku<>. Následující příklady ukazují dva updategramy: jeden používá jednoduché mapovací schéma a druhý složitější schéma.

Poznámka:

Tato dokumentace předpokládá, že znáte šablony a podporu mapovacích schémat v SQL Serveru. Pro více informací viz Úvod do anotovaných XSD schémat (SQLXML 4.0). Pro starší aplikace, které používají XDR, viz Annotated XDR Schemas (zastaralé v SQLXML 4.0).

Práce s datovými typy

Pokud schéma specifikuje obraz, binární nebo varbinárnítyp dat SQL Server (pomocí sql:datatype) a nespecifikuje XML datový typ, aktualizační gram předpokládá, že XML datový typ je binární v základu 64. Pokud jsou vaše data typu bin.base, musíte explicitně specifikovat typ (dt:type=bin.base nebo type="xsd:hexBinary").

Pokud schéma specifikuje datový typ dateTime, date nebo time XSD, musíte také zadat odpovídající datový typ SQL Server pomocí sql:datatype="dateTime".

Při zpracování parametrů typu money SQL Server musíte explicitně zadat sql:datatype="money" na příslušném uzlu v mapovacím schématu.

Examples

Pokud chcete vytvořit pracovní ukázky pomocí následujících příkladů, musíte splňovat požadavky uvedené v části Požadavky pro spouštění příkladů SQLXML.

A. Vytvoření updategramu s jednoduchým mapovacím schématem

Následující schéma XSD (SampleSchema.xml) je mapovací schéma, které mapuje prvek <Customer> na tabulku 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>  

Následující aktualizační gram vkládá záznam do tabulky Sales.Customer a spoléhá na předchozí mapovací schéma, aby správně mapoval tato data na tabulku. Všimněte si, že updategram používá stejný název prvku, <Customer>, jak je definováno ve schématu. To je povinné, protože updategram specifikuje konkrétní schéma.

Pro testování updategramu
  1. Zkopírujte výše uvedený kód schématu a vložte ho do textového souboru. Uložte soubor jako SampleUpdateSchema.xml.

  2. Zkopírujte šablonu updategramu níže a vložte ji do textového souboru. Ulož soubor jako SampleUpdategram.xml do stejného adresáře, kde jsi uložil SampleUpdateSchema.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>  
    

    Adresářová cesta určená pro mapovací schéma (SampleUpdateSchema.xml) je relativní k adresáři, ve kterém je šablona uložena. Absolutní cestu lze také specifikovat, například:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. Vytvořte a použijte testovací skript SQLXML 4.0 (Sqlxml4test.vbs) k provedení šablony.

    Další informace naleznete v tématu Použití ADO ke spouštění dotazů SQLXML 4.0.

Toto je ekvivalentní schéma 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. Vkládání záznamu pomocí vztahu rodič-dítě specifikovaného v mapovacím schématu

Prvky schématu lze vzájemně vztahovat. Prvek <sql:relation> specifikuje vztah rodič-potomek mezi prvky schématu. Tyto informace se používají k aktualizaci odpovídajících tabulek, které mají vztah primárního klíče/cizího klíče.

Následující mapovací schéma (SampleSchema.xml) se skládá ze dvou prvků, <Řádu> a <OD>:

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

Následující aktualizační gram používá toto schéma XSD k přidání nového záznamu o detailu objednávky (prvek <OD> v následném> bloku<) pro objednávku 43860. Atribut mapping-schema se používá k určení mapovacího schématu v updategramu.

<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>  
Pro testování updategramu
  1. Zkopírujte výše uvedený kód schématu a vložte ho do textového souboru. Uložte soubor jako SampleUpdateSchema.xml.

  2. Zkopírujte výše uvedenou šablonu updategramu a vložte ji do textového souboru. Ulož soubor jako SampleUpdategram.xml do stejného adresáře, kde jsi uložil SampleUpdateSchema.xml.

    Adresářová cesta určená pro mapovací schéma (SampleUpdateSchema.xml) je relativní k adresáři, ve kterém je šablona uložena. Absolutní cestu lze také specifikovat, například:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. Vytvořte a použijte testovací skript SQLXML 4.0 (Sqlxml4test.vbs) k provedení šablony.

    Další informace naleznete v tématu Použití ADO ke spouštění dotazů SQLXML 4.0.

Toto je ekvivalentní schéma 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. Vložení záznamu pomocí vztahu rodič-dítě a inverzní anotace specifikované v XSD schématu

Tento příklad ilustruje, jak logika updategramu využívá vztah rodič-dítě specifikovaný v XSD k zpracování aktualizací a jak se používá inverzní anotace. Pro více informací o inverzní anotaci viz Specifikace atributu sql:inverse na sql:relation (SQLXML 4.0).

Tento příklad předpokládá, že následující tabulky jsou v databázi tempdb :

  • Cust (CustomerID, CompanyName), kde CustomerID je primární klíč

  • Ord (OrderID, CustomerID), kde CustomerID je cizí klíč, který odkazuje na primární CustomerID klíč v tabulce Cust .

Updategram používá následující schéma XSD pro vkládání záznamů do tabulek Cust a 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 schéma v tomto příkladu obsahuje <prvky Zákazník> a <Objednávka> a specifikuje vztah rodič-dítě mezi těmito dvěma prvky. Identifikuje <Objednávku> jako nadřazenský prvek a <zákazníka> jako podřízený prvek.

Logika zpracování updategramů využívá informace o vztahu rodič-dítě k určení pořadí, v jakém jsou záznamy vkládány do tabulek. V tomto příkladu se logika updategramu nejprve pokusí vložit záznam do tabulky Ord (protože <Order> je rodič) a poté se pokusí vložit záznam do tabulky Cust (protože <Customer> je potomkem). Nicméně kvůli informacím o primárním klíči/cizím klíči, které jsou obsaženy ve schématu tabulky databáze, tato operace vkládání způsobuje porušení cizího klíče v databázi a vložení selže.

Pro instruaci logiky updategramu, aby během aktualizace obrátila vztah rodič-potomek, je na prvku <vztahu> specifikována inverzní anotace. Výsledkem je, že záznamy jsou nejprve přidány do tabulky Cust a poté do tabulky Ord, a operace je úspěšná.

Následující updategram vkládá objednávku (OrderID=2) do tabulky Ord a zákazníka (CustomerID='AAAAA') do tabulky Cust pomocí specifikovaného schématu XSD:

<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>  
Pro testování updategramu
  1. Vytvořte tyto tabulky v databázi 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. Zkopírujte výše uvedený kód schématu a vložte ho do textového souboru. Uložte soubor jako SampleUpdateSchema.xml.

  3. Zkopírujte výše uvedenou šablonu updategramu a vložte ji do textového souboru. Ulož soubor jako SampleUpdategram.xml do stejného adresáře, kde jsi uložil SampleUpdateSchema.xml.

    Adresářová cesta určená pro mapovací schéma (SampleUpdateSchema.xml) je relativní k adresáři, ve kterém je šablona uložena. Absolutní cestu lze také specifikovat, například:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  4. Vytvořte a použijte testovací skript SQLXML 4.0 (Sqlxml4test.vbs) k provedení šablony.

    Další informace naleznete v tématu Použití ADO ke spouštění dotazů SQLXML 4.0.

Viz také

Důležité informace o zabezpečení updategramu (SQLXML 4.0)