Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
При обновлении существующих данных необходимо указать как< до>, так и <после> блоков. Элементы, указанные <в блоках до> и <после> блоков, описывают требуемое изменение. На диаграмме обновления используются элементы, указанные в блоке <перед> определением существующих записей в базе данных. Соответствующие элементы в блоке <после> блокировки указывают, как записи должны выглядеть после выполнения операции обновления. Из этой информации в диаграмме обновления создается инструкция 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:before>
Элементы в блоке <перед> определением существующих записей в таблицах базы данных.
<updg:after>
Элементы в блоке <после> блока описывают, как записи, указанные в блоке <перед> применением обновлений.
Атрибут mapping-schema определяет схему сопоставления, используемую диаграммой обновления. Если диаграмма обновления указывает схему сопоставления, имена элементов и атрибутов, указанные в <блоках до> и <после> блоков, должны соответствовать именам в схеме. Схема сопоставления сопоставляет эти имена элементов или атрибутов с именами таблиц базы данных и столбцов.
Если диаграмма обновления не указывает схему, updategam использует сопоставление по умолчанию. В сопоставлении по умолчанию имя элемента>, указанное в диаграмме обновления,< сопоставляется с таблицей базы данных и дочерними элементами или атрибутами, сопоставленным столбцам базы данных.
Элемент в блоке <перед> блоком должен соответствовать только одной строке таблицы в базе данных. Если элемент совпадает с несколькими строками таблицы или не соответствует ни одной строке таблицы, диаграмма обновления возвращает ошибку и отменяет весь <блок синхронизации> .
Диаграмма обновления может включать несколько <блоков синхронизации> . Каждый <блок синхронизации> рассматривается как транзакция. Каждый <блок синхронизации> может иметь несколько <до> и <после> блоков. Например, при обновлении двух существующих записей можно указать два <до> и <после> пар, по одному для каждой записи.
Использование атрибута 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 можно восстановить.
А. Обновление записи
Следующая диаграмма обновления обновляет фамилию сотрудника до Fuller в таблице Person.Contact в базе данных AdventureWorks. Диаграмма обновления не указывает схему сопоставления; Поэтому в диаграмме обновления используется сопоставление по умолчанию.
<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".
В. Обновление нескольких записей с помощью атрибута updg:id
В этом примере диаграмма обновления выполняет два обновления таблицы HumanResources.Shift в базе данных AdventureWorks:
Он изменяет имя исходного смены дня, которая начинается в 7:00 утра с "День" на "Рано утром".
Он вставляет новый сдвиг с именем "Поздно утром", который начинается с 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".
Д. Указание нескольких <блоков синхронизации>
В диаграмме обновления можно указать несколько <блоков синхронизации> . Каждый <указанный блок синхронизации> является независимой транзакцией.
В следующей диаграмме обновления первый <блок синхронизации> обновляет запись в таблице 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".
Е. Использование схемы сопоставления
В этом примере диаграмма обновления указывает схему сопоставления с помощью атрибута 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).
F. Использование схемы сопоставления с атрибутами IDREFS
В этом примере показано, как диаграммы обновления используют атрибуты IDREFS в схеме сопоставления для обновления записей в нескольких таблицах. В этом примере предположим, что база данных состоит из следующих таблиц:
Student(StudentID, LastName)
Course(CourseID, CourseName)
Регистрация(StudentID, CourseID)
Поскольку учащийся может зарегистрироваться во многих курсах, и курс может иметь много студентов, третья таблица, таблица регистрации, требуется для представления этой связи 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>
При каждом указании этой схемы в диаграмме обновления и вставке записи в таблицу курсов вставляется новая запись курса в таблицу курсов. Если указать один или несколько новых идентификаторов учащихся для атрибута StudentIDList, диаграмма обновления также вставляет запись в таблицу регистрации для каждого нового учащегося. Диаграмма обновления гарантирует, что дубликаты не добавляются в таблицу регистрации.
Тестирование диаграммы обновления
Создайте эти таблицы в базе данных, указанной в виртуальном корне:
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, добавив запись в таблицу регистрации.
<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 вставляет записи в таблицу регистрации.
<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).