Обновление данных при помощи диаграмм обновления 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).
В большинстве примеров задействован образец базы данных База данных AdventureWorks2008R2.
А. Обновление записи
Следующая диаграмма обновления используется для изменения фамилии сотрудника на Fuller в таблице Person.Person базы данных База данных AdventureWorks2008R2. В диаграмме обновления не задана схема сопоставления, поэтому применяется сопоставление по умолчанию.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
<Person.Person BusinessEntityID="1" />
</updg:before>
<updg:after>
<Person.Person LastName="Fuller" />
</updg:after>
</updg:sync>
</ROOT>
Запись, описанная в блоке <before>, представляет текущую запись в базе данных. Диаграмма обновления использует для поиска записи значения всех столбцов, указанных в блоке <before>. В данной диаграмме обновления блок <before> содержит только столбец BusinessEntityID, поэтому диаграмма обновления использует для поиска записи всего одно значение. Если добавить в этот блок значение LastName, то диаграмма обновления будет производить поиск по обоим значениям — BusinessEntityID и LastName.
В данной диаграмме обновления блок <after> содержит только столбец LastName, поскольку только это значение нужно изменить.
Тестирование диаграммы обновления
Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateLastName.xml.
Создайте тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
Б. Обновление нескольких записей с помощью атрибута updg:id
В данном примере диаграмма обновления выполняет два обновления в таблице HumanResources.Shift в базе данных База данных AdventureWorks2008R2.
Имя исходной дневной смены, начинающейся в 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>.
Тестирование диаграммы обновления
Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateMultipleRecords.xml.
Создайте тестовый скрипт 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>
Тестирование диаграммы обновления
Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateMultipleBeforeAfter.xml.
Создайте тестовый скрипт 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"
SalesPersonID="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"
SalesPersonID="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>
Тестирование диаграммы обновления
Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateMultipleSyncs.xml.
Создайте тестовый скрипт 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>
Тестирование диаграммы обновления
Скопируйте приведенную выше схему сопоставления и вставьте ее в текстовый файл. Сохраните файл под именем UpdategramMappingSchema.xml.
Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateWithMappingSchema.xml в той же папке, в которой сохранена схема сопоставления (UpdategramMappingSchema.xml).
Создайте тестовый скрипт 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.
Тестирование диаграммы обновления
Создайте эти таблицы в базе данных в виртуальном корневом каталоге:
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))
Добавьте следующий образец данных:
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')
Скопируйте приведенную выше схему сопоставления и вставьте ее в текстовый файл. Сохраните файл под именем SampleSchema.xml.
Сохраните диаграмму обновления (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>
Создайте тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
Сохраните и выполните следующую диаграмму обновления, как описано на предыдущих шагах. Диаграмма обновления снова записывает студента с идентификатором 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>
Сохраните и выполните следующую диаграмму обновления, как описано на предыдущих шагах. Эта диаграмма обновления добавляет трех новых студентов и регистрирует их на курс 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).