Обновление данных при помощи диаграмм обновления XML (SQLXML 4.0)
Область применения: SQL Server База данных SQL Azure
При обновлении существующих данных необходимо указать как <до> , так и <после> блоков. Элементы, указанные <в блоках до> и <после> блоков, описывают требуемое изменение. На диаграмме обновления используются элементы, указанные в блоке <перед> определением существующих записей в базе данных. Соответствующие элементы в блоке <после> блокировки указывают, как записи должны выглядеть после выполнения операции обновления. Из этой информации в диаграмме обновления создается инструкция SQL, которая соответствует следующему> блоку<. Затем диаграмма обновления использует эту инструкцию для обновления базы данных.
Ниже представлен формат диаграммы обновления для операции обновления.
<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:до>
Элементы в блоке <перед> определением существующих записей в таблицах базы данных.
<updg:after>
Элементы в блоке <после> блока описывают, как записи, указанные в блоке <перед> применением обновлений.
Атрибут схемы сопоставления определяет схему сопоставления, используемую диаграммой обновления. Если диаграмма обновления указывает схему сопоставления, имена элементов и атрибутов, указанные в <блоках до> и <после> блоков, должны соответствовать именам в схеме. Схема сопоставления сопоставляет эти имена элементов или атрибутов с именами таблиц и столбцов в базе данных.
Если в диаграмме обновления не указана схема, используется сопоставление по умолчанию. В сопоставлении по умолчанию имя элемента>, указанное в диаграмме обновления, <сопоставляется с таблицей базы данных и дочерними элементами или атрибутами, сопоставленным столбцам базы данных.
Элемент в блоке <перед> блоком должен соответствовать только одной строке таблицы в базе данных. Если элемент совпадает с несколькими строками таблицы или не соответствует ни одной строке таблицы, диаграмма обновления возвращает ошибку и отменяет весь <блок синхронизации> .
Диаграмма обновления может включать несколько блоков синхронизации>.< Каждый <блок синхронизации> рассматривается как транзакция. Каждый <блок синхронизации> может иметь несколько <до> и< после> блоков. Например, при обновлении двух существующих записей можно указать два <до> и< после> пар, по одному для каждой записи.
Использование атрибута updg:id
Если в <блоках до> и <после> указано несколько элементов, используйте атрибут updg:id, чтобы пометить строки в <блоках до> и< после> них. Логика обработки использует эти сведения, чтобы определить, какая запись в блоке перед> блоком связана с записью>< после блока.<
Атрибут updg:id не требуется (хотя рекомендуется), если один из следующих вариантов существует:
Элементы в указанной схеме сопоставления имеют атрибут sql:key-fields , определенный на них.
Для ключевых полей в диаграмме обновления указано одно или несколько значений.
Если это так, в диаграмме обновления используются ключевые столбцы, указанные в полях sql:key-fields, для связывания элементов в< блоках до> и <после> них.
Если схема сопоставления не определяет ключевые столбцы (с помощью sql:key-fields) или если диаграмма обновления обновляет значение ключевого столбца, необходимо указать updg:id.
Записи, определенные в блоках до> и <после> блоков, не должны находиться в одном порядке.< Атрибут updg:id заставляет связь между элементами, указанными в< блоках до> и <после> них.
Если указать один элемент в блоке <до и> только один соответствующий элемент в блоке <после> блока, использование updg:id не требуется. Однако рекомендуется указать updg:id в любом случае, чтобы избежать неоднозначности.
Примеры
При использовании примеров диаграмм обновления необходимо учитывать следующие моменты.
В большинстве примеров используется сопоставление по умолчанию (то есть в диаграмме обновления схема сопоставления не задана). Дополнительные примеры схем обновлений, использующих схемы сопоставления, см. в разделе "Указание схемы аннотированного сопоставления" в диаграмме обновления (SQLXML 4.0).
В большинстве примеров задействован образец базы данных AdventureWorks. Все обновления применяются к таблицам в этой базе данных. Базу данных AdventureWorks можно восстановить.
А. Обновление записи
Следующая диаграмма обновления используется для изменения фамилии сотрудника в таблице 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>
Запись, описанная в блоке <ранее> , представляет текущую запись в базе данных. На диаграмме обновления используются все значения столбцов, указанные в блоке <перед> поиском записи. В этой диаграмме обновления блок <до этого> блока предоставляет только столбец ContactID. Таким образом, в диаграмме обновления используется только значение для поиска записи. Если добавить в этот блок значение LastName, то диаграмма обновления будет производить поиск по обоим значениям — ContactID и LastName.
В этой диаграмме обновления блок после> блокировки предоставляет только значение столбца LastName, <так как это единственное значение, которое изменяется.
Тестирование диаграммы обновления
Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateLastName.xml.
Создайте тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.
Дополнительные сведения см. в разделе "Использование ADO для выполнения запросов SQLXML 4.0".
B. Обновление нескольких записей с помощью атрибута updg:id
В данном примере диаграмма обновления выполняет два обновления в таблице HumanResources.Shift в базе данных AdventureWorks.
Имя исходной дневной смены, начинающейся в 7:00, меняется с «Day» на «Early Morning».
Также добавляется имя новой смены, «Late Morning», которая начинается в 10:00.
В диаграмме обновления атрибут updg:id создает связи между элементами до <>и< после> блоков.
<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 в <блоке перед> вторым экземпляром <элемента HumanResources.Shift>> в блоке< после> блока.
Тестирование диаграммы обновления
Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateMultipleRecords.xml.
Создайте тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.
Дополнительные сведения см. в разделе "Использование ADO для выполнения запросов SQLXML 4.0".
В. Указание нескольких <блоков до> и <после> блоков
Чтобы избежать неоднозначности, можно написать диаграмму обновления в примере B с помощью нескольких <пар блоков до> и <после> нее. Указание <до> и< после> пар является одним из способов указания нескольких обновлений с минимальной путаницой. Кроме того, если каждый из блоков до> и< после> блоков указывает не более одного элемента, вам не нужно использовать атрибут updg:id.<
Примечание.
Чтобы сформировать пару, тег 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".
D. Указание нескольких <блоков синхронизации>
В диаграмме обновления можно указать несколько <блоков синхронизации> . Каждый <указанный блок синхронизации> является независимой транзакцией.
В следующей диаграмме обновления первый <блок синхронизации> обновляет запись в таблице Sales.Customer. Для простоты в диаграмме обновления указаны только обязательные значения столбцов: идентификатор (CustomerID) и обновляемое значение (SalesPersonID).
Второй <блок синхронизации> добавляет две записи в таблицу Sales.SalesOrderHeader. В этой таблице SalesOrderID является столбцом типа IDENTITY. Поэтому диаграмма обновления не указывает значение SalesOrderID в каждом из <элементов Sales.SalesOrderHeader> .
Указание нескольких <блоков синхронизации полезно, так как если второй <блок синхронизации> (транзакция) не удалось добавить записи в таблицу Sales.SalesOrderHeader, первый <блок синхронизации>> по-прежнему может обновить запись клиента в таблице 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>
Тестирование диаграммы обновления
Скопируйте приведенный выше шаблон диаграммы обновления и вставьте его в текстовый файл. Сохраните файл под именем UpdateMultipleSyncs.xml.
Создайте тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.
Дополнительные сведения см. в разделе "Использование ADO для выполнения запросов SQLXML 4.0".
Е. Использование схемы сопоставления
В этом примере диаграмма обновления указывает схему сопоставления с помощью атрибута сопоставления схемы . (сопоставление по умолчанию отсутствует; это означает, что сопоставление элементов и атрибутов в диаграмме обновления с таблицами и столбцами базы данных производится согласно схеме сопоставления).
Элементы и атрибуты диаграммы обновления ссылаются на элементы и атрибуты схемы сопоставления.
Следующая схема сопоставления 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).
F. Использование схемы сопоставления с атрибутами IDREFS
В данном примере показано, каким образом диаграммы обновления используют атрибуты IDREFS в схеме сопоставления для обновления записей в нескольких таблицах. В этом примере предполагается, что база данных состоит из следующих таблиц.
Student(StudentID, LastName)
Course(CourseID, CourseName)
Enrollment(StudentID, CourseID)
Поскольку один студент может быть записан на несколько разных курсов, а на курс может быть записано много студентов, третья таблица Enrollment должна представлять связь M:N.
Следующая схема сопоставления XSD предоставляет XML-представление таблиц с помощью <элементов Student>, <Course> и <Enrollment>. Атрибуты IDREFS в схеме сопоставления указывают связь между этими элементами. Атрибут StudentIDList в элементе <Course> является атрибутом типа IDREFS, который ссылается на столбец StudentID в таблице Регистрации. Аналогичным образом атрибут EnrolledIn в <элементе Student> является атрибутом типа IDREFS, который ссылается на столбец CourseID в таблице Регистрации.
<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).