Определение схемы с заметками сопоставления в диаграмме обновления (SQLXML 4.0)

Область применения:yesSQL Server (все поддерживаемые версии) YesБаза данных SQL Azure

В этом разделе описывается использование схемы сопоставления (XSD или XDR), указанной в диаграмме обновления, для обработки обновлений. В диаграмме обновления можно указать имя схемы аннотированного сопоставления, используемой при сопоставлении элементов и атрибутов в диаграмме обновления с таблицами и столбцами в Microsoft SQL Server. Если в диаграмме обновления указана схема сопоставления, имена элементов и атрибутов, которые указаны в этой диаграмме обновления, должны сопоставляться с элементами и атрибутами в схеме сопоставления.

Чтобы указать схему сопоставления, используйте атрибут схемы сопоставления элемента синхронизации<>. В следующих примерах показаны две диаграммы обновления: в одной используется простая схема сопоставления, а в другой — более сложная схема сопоставления.

Примечание

В этой документации предполагается, что вы знакомы с шаблонами и поддержкой схемы сопоставления в SQL Server. Дополнительные сведения см. в разделе "Общие сведения о аннотированных схемах XSD (SQLXML 4.0)". Сведения о устаревших приложениях, использующих XDR, см. в разделе "Аннотированные схемы XDR" (нерекомендуемые в SQLXML 4.0).

Работа с типами данных

Если схема указывает образ, двоичный или varbinary SQL Server тип данных (с помощью sql:datatype) и не указывает тип данных XML, диаграмма обновления предполагает, что тип данных XML является двоичным основанием 64. Если данные — bin.base , необходимо явно указать тип (dt:type=bin.base или type="xsd:hexBinary").

Если схема указывает тип данных dateTime, date или time XSD, необходимо также указать соответствующий тип данных SQL Server с помощью sql:datatype="dateTime".

При обработке параметров SQL Server типа денег необходимо явно указать 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. Скопируйте приведенный ниже шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем SampleUpdategram.xml в том же каталоге, где был сохранен файл 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>  
    

    Путь к каталогу задается для схемы сопоставления (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>   

Б. Вставка записи с помощью связи «родители-потомки», указанной в схеме сопоставления

Между элементами схемы можно устанавливать связь. Элемент <sql:relationship> указывает связь "родитель-потомок" между элементами схемы. Эти данные используются для обновления соответствующих таблиц, между которыми установлена связь «первичный-внешний ключ».

Следующая схема сопоставления (SampleSchema.xml) состоит из двух элементов: <Order> и <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>  

Следующая диаграмма обновления использует эту схему XSD для добавления новой записи сведений о заказе ( <элемент OD> в <блоке after> ) для порядка 43860. Атрибут схемы сопоставления используется для указания схемы сопоставления в диаграмме обновления.

<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. Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем SampleUpdategram.xml в том же каталоге, где был сохранен файл SampleUpdateSchema.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>  

В. Вставка записи с помощью связи «родители-потомки» и заметки INVERSE, указанных в схеме XSD

В этом примере показано, как логика диаграммы обновления использует связь "родители-потомки", указанную в XSD, для обработки обновлений и как используется обратная заметка. Дополнительные сведения о обратной заметке см. в разделе "Указание атрибута sql:inverse в sql:relationship (SQLXML 4.0)".

В этом примере предполагается, что следующие таблицы находятся в базе данных tempdb :

  • Cust (CustomerID, CompanyName), где CustomerID — это первичный ключ;

  • Ord (OrderID, CustomerID), где CustomerID — это внешний ключ, который ссылается на первичный ключ CustomerID из таблицы Cust.

Для вставки записей в таблицы Cust и Ord в диаграмме обновления используется следующая схема XSD:

<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> , а также указывает связь "родители-потомки" между двумя элементами. Он определяет <Order> как родительский элемент и <Customer> как дочерний элемент.

Логика обработки диаграммы обновления использует данные о связи «родители-потомки» для определения порядка вставки записей в таблицы. В этом примере логика диаграмм обновления сначала пытается вставить запись в таблицу Ord (так как <Order> является родительским элементом), а затем пытается вставить запись в таблицу Cust (так как <клиент> является дочерним). Однако из-за данных «первичный-внешний ключ», которые содержатся в схеме таблицы базы данных, эта операция вставки ведет к нарушению внешнего ключа в базе данных и завершается неудачей.

Чтобы поручить логике диаграммы обновления отменить связь «родитель-потомок» во время операции обновления, в элементе связи> указывается обратная заметка<. В итоге записи будут сначала добавляться в таблицу Cust, а затем в таблицу Ord, и операция завершится успешно.

Следующая диаграмма обновления вставляет заказ (OrderID=2) в таблицу Ord, а клиента (CustomerID='AAAAA') — в таблицу Cust при помощи указанной схемы 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>  
Тестирование диаграммы обновления
  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. Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем SampleUpdategram.xml в том же каталоге, где был сохранен файл SampleUpdateSchema.xml.

    Путь к каталогу задается для схемы сопоставления (SampleUpdateSchema.xml) относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  4. Создайте и запустите тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.

    Дополнительные сведения см. в разделе "Использование ADO для выполнения запросов SQLXML 4.0".

См. также

Вопросы безопасности диаграмм обновления (SQLXML 4.0)