Обновление данных при помощи диаграмм обновления XML (SQLXML 4.0)

При обновлении существующих данных необходимо указать блоки <before> и <after>. Элементы, указанные в блоках <before> и <after>, описывают нужное изменение. Диаграмма обновления использует элементы, указанные в блоке <before> для идентификации существующих записей в базе данных. Соответствующие элементы в блоке <after> указывают, как должна выглядеть запись после выполнения операции обновления. На основе этих данных диаграмма обновления создает инструкцию SQL для сопоставления с блоком <after>. Затем диаграмма обновления использует эту инструкцию для обновления базы данных.

Далее представлен формат диаграммы обновления для операции обновления.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"><updg:sync [mapping-schema="SampleSchema.xml"]  >   <updg:before>      <ElementName [updg:id="value"] .../>      [<ElementName [updg:id="value"] .../> ... ]   </updg:before>   <updg:after>      <ElementName [updg:id="value"] ... />      [<ElementName [updg:id="value"] .../> ...]   </updg:after></updg:sync></ROOT>
  • <updg:before>
    Элементы в блоке <before> указывают существующие записи в таблицах базы данных.

  • <updg:after>
    Элементы в блоке <after> описывают, как записи, указанные в блоке <before>, должны выглядеть после применения обновлений.

Атрибут mapping-schema указывает схему сопоставления, которая будет использоваться диаграммной обновления. Если в диаграмме обновления указана схема сопоставления, имена элемента и атрибута в блоках <before> и <after> должны соответствовать именам в схеме. Схема сопоставления сопоставляет эти имена элементов или атрибутов с именами таблиц и столбцов в базе данных.

Если в диаграмме обновления не указана схема, используется сопоставление по умолчанию. При сопоставлении по умолчанию элемент <ElementName>, указанный в диаграмме обновления, сопоставляется с таблицей базы данных и дочерними элементами или атрибуты сопоставляются со столбцами базы данных.

Элемент в блоке <before> должен соответствовать только одной строке таблицы в базе данных. Если элемент соответствует нескольким строкам таблицы или не соответствует ни одной строке, диаграмма обновления возвращает ошибку и отменяет весь блок <sync>.

Диаграмма обновления может включать несколько блоков <sync>. Каждый блок <sync> обрабатывается как транзакция. Каждый блок <sync> может содержать несколько блоков <before> и <after>. Например, при обновлении двух существующих записей можно указать две пары блоков <before> и <after>, по одной для каждой обновляемой записи.

Использование атрибута updg:id

Если в блоках <before> и <after> указаны несколько элементов, используйте атрибут updg:id для отметки строк в блоках <before> и <after>. Логика обработки использует эти данные, чтобы определить, какая запись в блоке <before> соответствует какой записи в блоке <after>.

Атрибут updg:id не является обязательным (хотя его рекомендуется использовать) при одном из следующих условий.

  • Для элементов в указанной схеме сопоставления определен атрибут sql:key-fields.

  • Для ключевых полей в диаграмме обновления указано одно или несколько значений.

Если одно из этих условий соблюдено, диаграмма обновления использует ключевые столбцы, указанные в sql:key-fields, для определения пар элементов в блоках <before> и <after>.

Если в схеме сопоставления не указаны ключевые столбцы (с помощью sql:key-fields) или диаграмма обновления обновляет значение ключевого столбца, необходимо указать updg:id.

Записи в блоках <before> и <after> не обязательно должны следовать в одинаковом порядке. Атрибут updg:id принудительно сопоставляет элементы, указанные в блоках <before> и <after>.

Если в блоке <before> указан только один элемент и один соответствующий элемент в блоке <after>, использовать updg:id необязательно. Однако рекомендуется в любом случае применять updg:id, чтобы избежать недоразумений.

Примеры

При использовании примеров диаграмм обновления необходимо учитывать следующие моменты.

  • В большинстве примеров используется сопоставление по умолчанию (то есть в диаграмме обновления схема сопоставления не задана). Некоторые примеры диаграмм обновления, в которых используются схемы сопоставления, см. в разделе Определение схемы с заметками сопоставления в диаграмме обновления (SQLXML 4.0).

  • В большинстве примеров задействован образец базы данных AdventureWorks. Все обновления применяются к таблицам в этой базе данных. Базу данных AdventureWorks можно восстановить. Сведения о восстановлении базы данных AdventureWorks см. в разделе Образцы баз данных AdventureWorks.

A. Обновление записи

Следующая диаграмма обновления используется для изменения фамилии сотрудника в таблице Person.Contact базы данных AdventureWorks на Fuller. В диаграмме обновления не задана схема сопоставления, поэтому применяется сопоставление по умолчанию.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"><updg:sync ><updg:before>   <Person.Contact ContactID="1" /></updg:before><updg:after>   <Person.Contact LastName="Abel-Achong" /></updg:after></updg:sync></ROOT>

Запись, описанная в блоке <before>, представляет текущую запись в базе данных. Диаграмма обновления использует все значения столбца, указанные в блоке <before>, для поиска записи. В данной диаграмме обновления блок <before> представляет только столбец ContactID; поэтому диаграмма обновления использует для поиска записи только одно значение. Если добавить в этот блок значение LastName, диаграмма обновления использовала бы для поиска оба значения: ContactID и LastName.

В данной диаграмме обновления в блоке <after> представлен только столбец LastName, поскольку только это значение нужно изменить.

Тестирование диаграммы обновления

  1. Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateLastName.xml.

  2. Создайте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.

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

Б. Обновление нескольких записей с помощью атрибута updg:id

В данном примере диаграмма обновления выполняет два обновления в таблице HumanResources.Shift в базе данных AdventureWorks.

  • Имя исходной дневной смены, начинающейся в 7:00, меняется с "Day" на "Early Morning".

  • Также добавляется новое имя смены "Late Morning", начинающейся в 10:00.

В диаграмме обновления атрибут updg:id создает связи между элементами в блоках <before> и <after>.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  <updg:sync >    <updg:before>       <HumanResources.Shift updg:id="x" Name="Day" />    </updg:before>    <updg:after>      <HumanResources.Shift updg:id="y" Name="Late Morning"                             StartTime="1900-01-01 10:00:00.000"                            EndTime="1900-01-01 18:00:00.000"                            ModifiedDate="2004-06-01 00:00:00.000"/>      <HumanResources.Shift updg:id="x" Name="Early Morning" />    </updg:after>  </updg:sync></ROOT>

Обратите внимание, как атрибут updg:id сопоставляет первый экземпляр элемента <HumanResources.Shift> в блоке <before> со вторым экземплярам элемента <HumanResources.Shift> в блоке <after>.

Тестирование диаграммы обновления

  1. Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateMultipleRecords.xml.

  2. Создайте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.

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

В. Указание нескольких блоков <before> и <after>

Чтобы избежать недоразумений, можно написать диаграмму обновления из примера Б. с применением нескольких пар блоков <before> и <after>. Указание пар <before> и <after> – это один способ задать несколько изменений с минимумом путаницы. Также, если в одном из блоков <before> и <after> указано не более одного элемента, нет необходимости использовать атрибут updg:id.

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

Для создания пары тег <after> должен следовать непосредственно за соответствующим тегом <before>.

В следующей диаграмме обновления первая пара блоков <before> и <after> используется для обновления имени дневной смены. Вторая пара вставляет новую запись для смены.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  <updg:sync >    <updg:before>       <HumanResources.Shift ShiftID="1" Name="Day" />    </updg:before>    <updg:after>      <HumanResources.Shift Name="Early Morning" />    </updg:after>    <updg:before>    </updg:before>    <updg:after>      <HumanResources.Shift Name="Late Morning"                             StartTime="1900-01-01 10:00:00.000"                            EndTime="1900-01-01 18:00:00.000"                            ModifiedDate="2004-06-01 00:00:00.000"/>    </updg:after>  </updg:sync></ROOT>

Тестирование диаграммы обновления

  1. Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateMultipleBeforeAfter.xml.

  2. Создайте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.

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

Г. Указание нескольких блоков <sync>

В диаграмме обновления можно указать несколько блоков <sync>. Каждый указанный блок <sync> представляет независимую транзакцию.

В следующей диаграмме обновления первый блок <sync> обновляет запись в таблице Sales.Customer. Для простоты в диаграмме обновления указаны только необходимые значения столбцов: значение идентификатора (CustomerID) и обновляемое значение (SalesPersonID).

Второй блок <sync> добавляет две записи в таблицу Sales.SalesOrderHeader. В этой таблице SalesOrderID является столбцом с типом IDENTITY. Поэтому диаграмма обновления не указывает значение SalesOrderID в каждом элементе <Sales.SalesOrderHeader>.

Указание нескольких блоков <sync> может быть полезно, так как, если второй блок <sync> (транзакция) не сможет добавить записи в таблицу Sales.SalesOrderHeader, первый блок <sync> тем не менее сможет обновить запись о клиенте в таблице Sales.Customer.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  <updg:sync >    <updg:before>      <Sales.Customer CustomerID="1" SalesPersonID="280" />    </updg:before>    <updg:after>      <Sales.Customer CustomerID="1" SalesPersonID="283" />    </updg:after>  </updg:sync>  <updg:sync >    <updg:before>    </updg:before>    <updg:after>   <Sales.SalesOrderHeader              CustomerID="1"             RevisionNumber="1"             OrderDate="2004-07-01 00:00:00.000"             DueDate="2004-07-13 00:00:00.000"             OnlineOrderFlag="0"             ContactID="378"             BillToAddressID="985"             ShipToAddressID="985"             ShipMethodID="5"             SubTotal="24643.9362"             TaxAmt="1971.5149"             Freight="616.0984"             rowguid="01010101-2222-3333-4444-556677889900"             ModifiedDate="2004-07-08 00:00:00.000" />   <Sales.SalesOrderHeader             CustomerID="1"             RevisionNumber="1"             OrderDate="2004-07-01 00:00:00.000"             DueDate="2004-07-13 00:00:00.000"             OnlineOrderFlag="0"             ContactID="378"             BillToAddressID="985"             ShipToAddressID="985"             ShipMethodID="5"             SubTotal="1000.0000"             TaxAmt="0.0000"             Freight="0.0000"             rowguid="10101010-2222-3333-4444-556677889900"             ModifiedDate="2004-07-09 00:00:00.000" />    </updg:after>  </updg:sync></ROOT>

Тестирование диаграммы обновления

  1. Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateMultipleSyncs.xml.

  2. Создайте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.

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

Д. Использование схемы сопоставления

В данном примере диаграмма обновления указывает на схему сопоставления с помощью атрибута mapping-schema. (Сопоставление по умолчанию не применяется; это значит, что сопоставление элементов и атрибутов в диаграмме обновления с таблицами и столбцами базы данных производится согласно схеме сопоставления.)

Элементы и атрибуты в диаграмме обновления ссылаются на элементы и атрибуты в схеме сопоставления.

Следующая схема сопоставления XSD содержит элементы <Customer>, <Order>и <OD>, сопоставляемые с таблицами Sales.Customer, Sales.SalesOrderHeader и Sales.SalesOrderDetail в базе данных.

<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="CustomerOrder"          parent="Sales.Customer"          parent-key="CustomerID"          child="Sales.SalesOrderHeader"          child-key="CustomerID" />    <sql:relationship name="OrderOD"          parent="Sales.SalesOrderHeader"          parent-key="SalesOrderID"          child="Sales.SalesOrderDetail"          child-key="SalesOrderID" />  </xsd:appinfo></xsd:annotation>  <xsd:element name="Customer" sql:relation="Sales.Customer" >   <xsd:complexType>     <xsd:sequence>        <xsd:element name="Order"                      sql:relation="Sales.SalesOrderHeader"                     sql:relationship="CustomerOrder" >           <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:sequence>      <xsd:attribute name="CustomerID"   type="xsd:string" />     </xsd:complexType>  </xsd:element></xsd:schema>

В следующей диаграмме указана эта схема сопоставления (UpdategramMappingSchema.xml). Диаграмма обновления добавляет элемент со сведениями об определенном заказе в таблицу Sales.SalesOrderDetail. Диаграмма обновления содержит вложенные элементы: элемент <OD> находится внутри элемента <Order>. Связь первичный ключ/внешний ключ между этими элементами указана в схеме сопоставления.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  <updg:sync mapping-schema="UpdategramMappingSchema.xml" >    <updg:before>       <Order SalesOrderID="43659" />    </updg:before>    <updg:after>      <Order SalesOrderID="43659" >          <OD ProductID="776" UnitPrice="2329.0000"              OrderQty="2" UnitPriceDiscount="0.0" />      </Order>    </updg:after>  </updg:sync></ROOT>

Тестирование диаграммы обновления

  1. Скопируйте приведенную выше схему сопоставления и вставьте ее в текстовый файл. Сохраните файл под именем UpdategramMappingSchema.xml.

  2. Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateWithMappingSchema.xml в той же папке, в которой сохранена схема сопоставления (UpdategramMappingSchema.xml).

  3. Создайте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.

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

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

Е. Использование схемы сопоставления с атрибутами IDREFS

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

  • Student(StudentID, LastName)

  • Course(CourseID, CourseName)

  • Enrollment(StudentID, CourseID)

Поскольку студент может изучать несколько курсов, а на курс может быть записано много студентов, третья таблица Enrollment должна представлять эту связь M:N.

Следующая схема сопоставления XSD создает представление этих таблиц в виде XML с помощью элементов <Student>, <Course> и <Enrollment>. Атрибуты IDREFS в схеме сопоставления обозначают отношения между этими элементами. Атрибут StudentIDList элемента <Course> является атрибутом типа IDREFS и относится к столбцу StudentID в таблице Enrollment. Аналогичным образом атрибут EnrolledIn элемента <Student> является атрибутом типа IDREFS и относится к столбцу CourseID в таблице Enrollment.

<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="StudentEnrollment"          parent="Student"          parent-key="StudentID"          child="Enrollment"          child-key="StudentID" />    <sql:relationship name="CourseEnrollment"          parent="Course"          parent-key="CourseID"          child="Enrollment"          child-key="CourseID" />  </xsd:appinfo></xsd:annotation>  <xsd:element name="Course" sql:relation="Course"                              sql:key-fields="CourseID" >    <xsd:complexType>    <xsd:attribute name="CourseID"  type="xsd:string" />     <xsd:attribute name="CourseName"   type="xsd:string" />     <xsd:attribute name="StudentIDList" sql:relation="Enrollment"                 sql:field="StudentID"                 sql:relationship="CourseEnrollment"                                      type="xsd:IDREFS" />    </xsd:complexType>  </xsd:element>  <xsd:element name="Student" sql:relation="Student" >    <xsd:complexType>    <xsd:attribute name="StudentID"  type="xsd:string" />     <xsd:attribute name="LastName"   type="xsd:string" />     <xsd:attribute name="EnrolledIn" sql:relation="Enrollment"                 sql:field="CourseID"                 sql:relationship="StudentEnrollment"                                      type="xsd:IDREFS" />    </xsd:complexType>  </xsd:element></xsd:schema>

Если указать эту схему в диаграмме обновления и добавить запись в таблицу Course, диаграмма обновления вставит новую запись о курсе в таблицу Course. Если указать один или несколько идентификаторов студентов в атрибуте StudentIDList, диаграмма обновления также добавит запись в таблицу Enrollment для каждого нового студента. Диаграмма обновления обеспечивает отсутствие дублирующих друг друга записей в таблицу Enrollment.

Тестирование диаграммы обновления

  1. Создайте эти таблицы в базе данных в виртуальном корневом каталоге:

    CREATE TABLE Student(StudentID varchar(10) primary key,                      LastName varchar(25))CREATE TABLE Course(CourseID varchar(10) primary key,                     CourseName varchar(25))CREATE TABLE Enrollment(StudentID varchar(10)                                   references Student(StudentID),                       CourseID varchar(10)                                   references Course(CourseID))
    
  2. Добавьте следующий образец данных:

    INSERT INTO Student VALUES ('S1','Davoli')INSERT INTO Student VALUES ('S2','Fuller')INSERT INTO Course VALUES  ('CS101', 'C Programming')INSERT INTO Course VALUES  ('CS102', 'Understanding XML')INSERT INTO Enrollment VALUES ('S1', 'CS101')INSERT INTO Enrollment VALUES ('S1', 'CS102')
    
  3. Скопируйте приведенную выше схему сопоставления и вставьте ее в текстовый файл. Сохраните файл с именем SampleSchema.xml.

  4. Сохраните диаграмму обновления (SampleUpdategram) в той же папке, что и схему сопоставления в предыдущем шаге. (Эта диаграмма обновления удаляет студента с идентификатором StudentID="1" из курса CS102.)

    <ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  <updg:sync mapping-schema="SampleSchema.xml" >    <updg:before>        <Student updg:id="x" StudentID="S1" LastName="Davolio"                             EnrolledIn="CS101 CS102" />    </updg:before>    <updg:after >        <Student updg:id="x" StudentID="S1" LastName="Davolio"                             EnrolledIn="CS101" />    </updg:after>  </updg:sync></ROOT>
    
  5. Создайте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.

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

  6. Сохраните и выполните следующую диаграмму обновления, как описано на предыдущих шагах. Диаграмма обновления снова записывает студента с идентификатором StudentID="1" на курс CS102 путем добавления записи в таблицу Enrollment.

    <ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  <updg:sync mapping-schema="SampleSchema.xml" >    <updg:before>        <Student updg:id="x" StudentID="S1" LastName="Davolio"                             EnrolledIn="CS101" />    </updg:before>    <updg:after >        <Student updg:id="x" StudentID="S1" LastName="Davolio"                             EnrolledIn="CS101 CS102" />    </updg:after>  </updg:sync></ROOT>
    
  7. Сохраните и выполните следующую диаграмму обновления, как описано на предыдущих шагах. Эта диаграмма обновления добавляет трех новых студентов и записывает их на курс CS101. Связь IDREFS вставляет запись в таблицу Enrollment.

    <ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  <updg:sync mapping-schema="SampleSchema.xml" >    <updg:before>       <Course updg:id="y" CourseID="CS101"                            CourseName="C Programming" />    </updg:before>    <updg:after >       <Student updg:id="x1" StudentID="S3" LastName="Leverling" />       <Student updg:id="x2" StudentID="S4" LastName="Pecock" />       <Student updg:id="x3" StudentID="S5" LastName="Buchanan" />       <Course updg:id="y" CourseID="CS101"                           CourseName="C Programming"                           StudentIDList="S3 S4 S5" />    </updg:after>  </updg:sync></ROOT>
    

Эквивалентная схема 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="Enrollment" sql:relation="Enrollment" sql:key-fields="StudentID CourseID">    <AttributeType name="StudentID" dt:type="id" />    <AttributeType name="CourseID" dt:type="id" />    <attribute type="StudentID" />    <attribute type="CourseID" />  </ElementType>  <ElementType name="Course" sql:relation="Course" sql:key-fields="CourseID">    <AttributeType name="CourseID" dt:type="id" />    <AttributeType name="CourseName" />     <attribute type="CourseID" />    <attribute type="CourseName" />    <AttributeType name="StudentIDList" dt:type="idrefs" />    <attribute type="StudentIDList" sql:relation="Enrollment" sql:field="StudentID" >        <sql:relationship                key-relation="Course"                key="CourseID"                foreign-relation="Enrollment"                foreign-key="CourseID" />    </attribute>  </ElementType>  <ElementType name="Student" sql:relation="Student">    <AttributeType name="StudentID" dt:type="id" />     <AttributeType name="LastName" />    <attribute type="StudentID" />    <attribute type="LastName" />    <AttributeType name="EnrolledIn" dt:type="idrefs" />    <attribute type="EnrolledIn" sql:relation="Enrollment" sql:field="CourseID" >        <sql:relationship                key-relation="Student"                key="StudentID"                foreign-relation="Enrollment"                foreign-key="StudentID" />    </attribute>    <element type="Enrollment" sql:relation="Enrollment" >        <sql:relationship key-relation="Student"                          key="StudentID"                          foreign-relation="Enrollment"                          foreign-key="StudentID" />    </element>  </ElementType></Schema>

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