Megosztás a következőn keresztül:


Egy annotált leképezési séma meghatározása egy updategramban (SQLXML 4.0)

A következőkre vonatkozik:SQL ServerAzure SQL Database

Ez a téma elmagyarázza, hogyan használják a updategramban megadott leképezési sémát (XSD vagy XDR) a frissítések feldolgozására. Egy updategramban megadhatod egy annotált leképezési séma nevét, amelyet az updategram elemeihez és attribútumaihoz a Microsoft SQL Server táblázataihoz és oszlopaihoz használhatsz. Amikor egy leképezési sémát megadnak egy updategramban, az updategramban megadott elem- és attribútumneveknek a leképezési séma elemeihez és attribútumaihoz kell leképezniük.

A leképezési séma megadásához a sync> elem mapping-séma attribútumát< használjuk. Az alábbi példák két updategramot mutatnak: az egyik, amely egyszerű leképezési sémát használ, a másik pedig egy összetettebb sémát.

Megjegyzés:

Ez a dokumentáció feltételezi, hogy ismered a sablonokat és a térképezési séma támogatást az SQL Serverben. További információért lásd: Bevezetés az annotált XSD sémákhoz (SQLXML 4.0). Az XDR-t használó régi alkalmazásokért lásd: Annotált XDR sémák (az SQLXML 4.0-ban elavult).

Adattípusok kezelése

Ha a séma megadja a kép-, bináris vagy varbinárisSQL Server adattípust ( sql:datatype használatával), és nem határoz meg XML adattípust, akkor a updategram feltételezi, hogy az XML adattípus bináris alap 64. Ha az adataid bin.base típusúak, akkor kifejezetten meg kell határoznod a típust (dt:type=bin.base vagy type="xsd:hexBinary").

Ha a séma megadja a dateTime, date vagy time XSD adattípust, akkor a megfelelő SQL Server adattípust is meg kell adnod sql:datatype="dateTime" használatával.

Az SQL Server pénz típus paramétereinek kezelésekor kifejezetten meg kell jelölni a sql:datatype="money " csomópontot a megfelelő csomóponton a leképezési sémában.

Példák

Ha az alábbi példák alapján szeretne munkamintákat létrehozni, meg kell felelnie az SQLXML-példák futtatására vonatkozó követelményeknek.

A. Egyszerű leképezési sémával létrehozott updategram

A következő XSD séma (SampleSchema.xml) egy leképező séma, amely az <ügyfélelemet> a Sales.Customer táblához képezi:

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

A következő updategram egy rekordot helyez be a Sales.Customer táblába, és a korábbi leképezési sémára támaszkodik, hogy megfelelően leképezze ezeket az adatokat a táblával. Figyeljük meg, hogy a updategram ugyanazt az elem nevét, <Customer-et> használja, mint ahogy a sémában is meghatározzuk. Ez kötelező, mert a updategram egy adott sémát ad meg.

A updategram teszteléséhez
  1. Másold le a fenti sémakódot, és illesztsd be egy szövegfájlba. Mentse el a fájlt SampleUpdateSchema.xml.

  2. Másold le az alábbi updategram sablont, és illesztsd be szövegfájlba. Mentsd a fájlt SampleUpdategram.xml-ként ugyanabba a könyvtárba, ahol SampleUpdateSchema.xmlmentetted.

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

    A leképezési sémához (SampleUpdateSchema.xml) megadott könyvtári út viszonyítja azt a könyvtárat, ahol a sablon mentő. Abszolút út is meghatározható, például:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. Hozd létre és használd az SQLXML 4.0 Test Scriptet (Sqlxml4test.vbs) a sablon végrehajtásához.

    További információ: SqlXML 4.0-lekérdezések végrehajtása az ADO használatával.

Ez a megfelelő XDR-séma:

<?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. Rekord beillesztése a leképezési sémában megadott szülő-gyermek kapcsolat használatával

A séma elemek kapcsolódhatnak egymáshoz. A< sql:relationship> elem meghatározza a séma elemek közötti szülő-gyermek kapcsolatot. Ezt az információt arra használják, hogy frissítsék azokat a táblázatokat, amelyek elsődleges kulcs/idegen kulcs kapcsolatot képviselnek.

A következő leképezési séma (SampleSchema.xml) két elemből áll, <Rendből> és <OD-ből>:

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

A következő updategram ezt az XSD sémát használja, hogy új rendelési részlet rekordot (egy <OD> elem a <záróblokkban> ) hozzáadjon a 43860-as rendeléshez. A mapping-séma attribútumot használják a leképezési séma megadására a updategramban.

<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>  
A updategram teszteléséhez
  1. Másold le a fenti sémakódot, és illesztsd be egy szövegfájlba. Mentse el a fájlt SampleUpdateSchema.xml.

  2. Másold le a fenti updategram sablont, és illesztsd be szövegfájlba. Mentsd a fájlt SampleUpdategram.xml-ként ugyanabba a könyvtárba, ahol SampleUpdateSchema.xmlmentetted.

    A leképezési sémához (SampleUpdateSchema.xml) megadott könyvtári út viszonyítja azt a könyvtárat, ahol a sablon mentő. Abszolút út is meghatározható, például:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. Hozd létre és használd az SQLXML 4.0 Test Scriptet (Sqlxml4test.vbs) a sablon végrehajtásához.

    További információ: SqlXML 4.0-lekérdezések végrehajtása az ADO használatával.

Ez a megfelelő XDR-séma:

<?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. Rekord beillesztése az XSD sémában meghatározott szülő-gyermek kapcsolat és inverz annotáció használatával

Ez a példa bemutatja, hogyan használja az updategram logika az XSD-ben megadott szülő-gyermek kapcsolatot a frissítések feldolgozásához, és hogyan használják az inverz annotációt. További információért az inverz annotációról lásd: A sql:inverse attribútum meghatározása sql:relationship-en (SQLXML 4.0).

Ez a példa feltételezi, hogy a következő táblák a tempdb adatbázisban találhatók:

  • Cust (CustomerID, CompanyName), ahol CustomerID a primer kulcs

  • Ord (OrderID, CustomerID), ahol CustomerID egy idegen kulcs, amely a táblázatban lévő CustomerID elsődleges kulcsra Cust utal.

A updategram a következő XSD sémát használja a rekordok beillesztésére a Cust és Ord táblákba:

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

Az XSD séma ebben a példában Ügyfél>- és Rendeléselemeket tartalmaz<, és megadja a szülő-gyermek kapcsolatot a két elem között.>< A Ordert> az alapelemként,<<a Customer-et> pedig a gyermekelemként azonosítja.

Az updategram feldolgozási logika a szülő-gyermek kapcsolatról szóló információkat használja annak meghatározására, hogy milyen sorrendben kerülnek be a rekordok a táblákba. Ebben a példában az updategram logika először megpróbál egy rekordot beilleszteni az Ord táblába (mivel <a Order> az parent), majd megpróbál egy bejegyzést beilleszteni a Cust táblába (mivel <a Customer> a gyermek). Azonban az adatbázis tábla-sémájában található elsődleges kulcs/idegen kulcs információ miatt ez a beszúrási művelet idegen kulcs megsértést okoz az adatbázisban, és a beszúrás meghibásodik.

Ahhoz, hogy az updategram logikát megfordítsa a szülő-gyermek kapcsolat visszafordítása a frissítési művelet során, a kapcsolat> elemen az inverz annotációt megadjuk<. Ennek eredményeként először a Cust táblázatba, majd az Ord táblázatba kerülnek a feljegyzések, és a művelet sikeres lesz.

A következő updategram egy rendelést (OrderID=2) helyez be az Ord táblába, valamint egy ügyfelet (CustomerID='AAAAA') a Cust táblába a megadott XSD séma használatával:

<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>  
A updategram teszteléséhez
  1. Hozza létre ezeket a táblákat a tempdb adatbázisban:

    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. Másold le a fenti sémakódot, és illesztsd be egy szövegfájlba. Mentse el a fájlt SampleUpdateSchema.xml.

  3. Másold le a fenti updategram sablont, és illesztsd be szövegfájlba. Mentsd a fájlt SampleUpdategram.xml-ként ugyanabba a könyvtárba, ahol SampleUpdateSchema.xmlmentetted.

    A leképezési sémához (SampleUpdateSchema.xml) megadott könyvtári út viszonyítja azt a könyvtárat, ahol a sablon mentő. Abszolút út is meghatározható, például:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  4. Hozd létre és használd az SQLXML 4.0 Test Scriptet (Sqlxml4test.vbs) a sablon végrehajtásához.

    További információ: SqlXML 4.0-lekérdezések végrehajtása az ADO használatával.

Lásd még:

Updategram biztonsági megfontolások (SQLXML 4.0)