Поделиться через


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

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

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

ПримечаниеПримечание

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

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

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

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

При обработке параметров типа данных SQL Servermoney необходимо явно указывать sql:datatype="money" для соответствующего узла в схеме сопоставления.

Примеры

Чтобы создать рабочие образцы с использованием следующих примеров, необходимо выполнить требования, перечисленные в разделе Требования к запуску примеров SQLXML.

А. Создание диаграммы обновления с простой схемой сопоставления

Следующая схема 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. При помощи атрибута 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. Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем 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, в логике диаграммы обновления для обработки обновлений, а также использование заметки inverse. Дополнительные сведения о заметке inverse см. в разделе Задание значения атрибута 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 (поскольку <Customer> является дочерним элементом). Однако из-за данных типа «основной ключ-внешний ключ», которые содержатся в схеме таблицы базы данных, эта операция вставки ведет к нарушению внешнего ключа в базе данных и завершается неудачей.

Заметка inverse задается в элементе <relationship>, чтобы указать логике диаграммы обновления использовать во время операции обновления связь типа «родители-потомки» в обратном порядке. В итоге записи будут сначала добавляться в таблицу 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 tempdbCREATE TABLE Cust(CustomerID varchar(5) primary key,                   CompanyName varchar(20))GOCREATE 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.