Atualizando dados que usam diagramas de atualização XML (SQLXML 4.0)
Ao atualizar dados existentes, você deve especificar os blocos <before> e <after>. Os elementos especificados nos blocos <before> e <after> descrevem a alteração desejada. O diagrama de atualização usa o(s) elemento(s) que é(são) especificado(s) no bloco <before> para identificar o(s) registro(s) existente(s) no banco de dados. O(s) elemento(s) correspondente(s) no bloco <after> indica(m) como os registros devem aparecer após a execução da operação de atualização. A partir destas informações, o diagrama de atualização cria uma instrução SQL que corresponde ao bloco <after>. O diagrama de atualização usa esta instrução para atualizar o banco de dados.
Este é o formato do diagrama de atualização para uma operação de atualização:
<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>
Os elementos no bloco <before> identificam os registros existentes nas tabelas de banco de dados.<updg:after>
Os elementos no bloco <after> descrevem como os registros especificados no bloco <before> devem aparecer depois que as atualizações são aplicadas.
O atributo mapping-schema identifica o esquema de mapeamento a ser usado pelo diagrama de atualização. Se o diagrama de atualização especificar um esquema de mapeamento, os nomes de elemento e atributo especificados nos blocos <before> e <after> devem corresponder aos nomes no esquema. O esquema de mapeamento mapeia esses nomes de elemento ou atributo para os nomes de tabela de banco de dados e de coluna.
Se um diagrama de atualização não especificar um esquema, o diagrama usará mapeamento padrão. No mapeamento padrão, o <ElementName> especificado no diagrama de atualização é mapeado para a tabela de banco de dados e os elementos-filho ou atributos são mapeados para as colunas do banco de dados.
Um elemento no bloco <before> deve corresponder a apenas uma linha de tabela no banco de dados. Se o elemento corresponder a várias linhas da tabela ou não corresponder a nenhuma linha, o diagrama de atualização retornará um erro e cancelará todo o bloco <sync>.
Um diagrama de atualização pode incluir vários blocos <sync>. Cada bloco <sync> é tratado como uma transação. Cada bloco <sync> pode ter vários blocos <before> e <after>. Por exemplo, se você estiver atualizando dois dos registros existentes, poderá especificar dois pares <before> e <after>, um para cada registro que está sendo atualizado.
Usando o atributo updg:id
Quando forem especificados vários elementos nos blocos <before> e <after>, use o atributo updg:id para marcar linhas nos blocos <before> e <after>. A lógica de processamento usa estas informações para determinar qual registro no bloco <before> combina com qual registro no bloco <after>.
O atributo updg:id não será necessário (embora recomendado) se alguma das seguintes situações existir:
Os elementos no esquema de mapeamento especificado tiverem o atributo sql:key-fields definido neles.
Há um ou mais valor específico fornecido para o campo chave no diagrama de atualização.
Se qualquer um dos dois for o caso, o diagrama de atualização usará as colunas de chave que são especificadas nos sql:key-fields para combinar os elementos nos blocos <before> e <after>.
Se o esquema de mapeamento não identificar as colunas de chave (usando sql:key-fields) ou se o diagrama de atualização estiver atualizando um valor da coluna de chave, você deverá especificar updg:id.
Os registros que são identificados nos blocos <before> e <after> não precisam estar na mesma ordem. O atributo updg:id força a associação entre os elementos que são especificados nos blocos <before> e <after>.
Se você especificar um elemento no bloco <before> e só um elemento correspondente no bloco <after>, o uso de updg:id não será necessário. Porém, é recomendado que você especifique updg:id de qualquer maneira para evitar ambiguidade.
Exemplos
Antes de você usar os exemplos do diagrama de atualização, observe o seguinte:
- A maioria dos exemplos usa mapeamento padrão (ou seja, nenhum esquema de mapeamento é especificado no diagrama de atualização). Para obter mais exemplos de diagramas de atualização que usam esquemas de mapeamento, consulte Especificando um esquema de mapeamento anotado em um diagrama de atualização (SQLXML 4.0).
A maioria dos exemplos usam o banco de dados de exemplo do AdventureWorks2008R2.
A. Atualizando um registro
O diagrama de atualização a seguir atualiza o sobrenome do funcionário para Silva na tabela Person.Person no banco de dados do AdventureWorks2008R2. O diagrama de atualização não especifica nenhum esquema de mapeamento; portanto, o diagrama de atualização usa o mapeamento padrão.
<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>
O registro descrito no bloco <before> representa o registro atual no banco de dados. O diagrama de atualização usa todos os valores de coluna especificados no bloco <before> para procurar o registro. Neste diagrama de atualização, o bloco <before> fornece apenas a coluna BusinessEntityID; portanto, o diagrama de atualização usa apenas o valor para procurar o registro. Se você fosse acrescentar o valor LastName a esse bloco, o diagrama de atualização usaria os valores BusinessEntityID e LastName na pesquisa.
Neste diagrama de atualização, o bloco <after> fornece só o valor da coluna LastName porque esse é o único valor que está sendo alterado.
Para testar o diagrama de atualização
Copie o modelo de diagrama de atualização acima e cole-o em um arquivo de texto. Salve o arquivo como UpdateLastName.xml.
Crie e use o Script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o diagrama de atualização.
Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.
B. Atualizando vários registros usando o atributo updg:id
Neste exemplo, o diagrama de atualização executa duas atualizações na tabela HumanResources.Shift no banco de dados do AdventureWorks2008R2:
Ele altera o nome do turno do dia original que inicia às 7h00 do "Dia" até a "Madrugada".
Insere um novo turno denominado "Fim da Manhã" que inicia às 10h00.
No diagrama de atualização, o atributo updg:id cria associações entre elementos nos blocos <before> e <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>
Observe como o atributo updg:id combina a primeira instância do elemento <HumanResources.Shift> no bloco <before> com a segunda instância do elemento <HumanResources.Shift> no bloco <after>.
Para testar o diagrama de atualização
Copie o modelo de diagrama de atualização acima e cole-o em um arquivo de texto. Salve o arquivo como UpdateMultipleRecords.xml.
Crie e use o Script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o diagrama de atualização.
Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.
C. Especificando vários blocos <before> e <after>
Para evitar ambiguidade, você pode escrever o diagrama de atualização no Exemplo B usando vários pares de blocos <before> e <after>. A especificação dos pares <before> e <after> é uma maneira de especificar várias atualizações com um mínimo de confusão. Além disso, se cada um dos blocos <before> e <after> especificar no máximo um elemento, você não terá que usar o atributo updg:id.
Observação |
---|
Para formar um par, a marca <after> deve vir logo após a marca <before> correspondente. |
No diagrama de atualização a seguir, o primeiro par <before> e <after> atualiza o nome do turno para o turno do dia. O segundo par insere um novo registro de turno.
<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>
Para testar o diagrama de atualização
Copie o modelo de diagrama de atualização acima e cole-o em um arquivo de texto. Salve o arquivo como UpdateMultipleBeforeAfter.xml.
Crie e use o Script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o diagrama de atualização.
Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.
D. Especificando vários blocos <sync>
Você pode especificar vários blocos <sync> em um diagrama de atualização. Cada bloco <sync> que é especificado é uma transação independente.
No diagrama de atualização a seguir, o primeiro bloco <sync> atualiza um registro na tabela Sales.Customer. Por causa da simplicidade, o diagrama de atualização especifica só os valores de coluna exigidos; o valor de identidade (CustomerID) e o valor que está sendo atualizado (SalesPersonID).
O segundo bloco <sync> acrescenta dois registros à tabela Sales.SalesOrderHeader. Para esta tabela, SalesOrderID é uma coluna do IDENTITY. Portanto, o diagrama de atualização não especifica o valor de SalesOrderID em cada dos elementos <Sales.SalesOrderHeader>.
A especificação de vários blocos <sync> será útil, pois se o segundo bloco <sync> (uma transação) não adicionar registros à tabela Sales.SalesOrderHeader, o primeiro bloco <sync> ainda poderá atualizar o registro do cliente na tabela 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>
Para testar o diagrama de atualização
Copie o modelo de diagrama de atualização acima e cole-o em um arquivo de texto. Salve o arquivo como UpdateMultipleSyncs.xml.
Crie e use o Script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o diagrama de atualização.
Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.
E. Usando um esquema de mapeamento
Neste exemplo, o diagrama de atualização especifica um esquema de mapeamento usando o atributo mapping-schema. (Não há um mapeamento padrão; isto é, o esquema de mapeamento fornece o mapeamento necessário de elementos e atributos no diagrama de atualização para as tabelas e colunas do banco de dados.)
Os elementos e atributos especificados no diagrama de atualização referem-se aos elementos e atributos no esquema de mapeamento.
O esquema de mapeamento XSD a seguir tem elementos <Customer>, <Order> e <OD> que mapeiam para as tabelas Sales.Customer, Sales.SalesOrderHeader e Sales.SalesOrderDetail no banco de dados.
<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>
Este esquema de mapeamento (UpdategramMappingSchema.xml) é especificado no diagrama de atualização a seguir. O diagrama de atualização adiciona um item de detalhe de ordem na tabela Sales.SalesOrderDetail para uma ordem específica. O diagrama de atualização inclui elementos aninhados: um elemento <OD> aninhado dentro de um elemento <Order>. A relação de chave primária/chave estrangeira entre estes dois elementos é especificada no esquema de mapeamento.
<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>
Para testar o diagrama de atualização
Copie o esquema de mapeamento acima e cole-o em um arquivo de texto. Salve o arquivo como UpdategramMappingSchema.xml.
Copie o modelo de diagrama de atualização acima e cole-o em um arquivo de texto. Salve o arquivo como UpdateWithMappingSchema.xml na mesma pasta que foi usada para salvar o esquema de mapeamento (UpdategramMappingSchema.xml).
Crie e use o Script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o diagrama de atualização.
Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.
Para obter mais exemplos de diagramas de atualização que usam esquemas de mapeamento, consulte Especificando um esquema de mapeamento anotado em um diagrama de atualização (SQLXML 4.0).
F. Usando um esquema de mapeamento com atributos IDREFS
Este exemplo ilustra como os diagramas de atualização usam os atributos IDREFS no esquema de mapeamento para atualizar registros em várias tabelas. Para obter este exemplo, assuma que o banco de dados consiste nas seguintes tabelas:
Student(StudentID, LastName)
Course(CourseID, CourseName)
Enrollment(StudentID, CourseID)
Como um aluno pode se matricular em vários cursos e um curso pode ter muitos alunos, a terceira tabela, Enrollment, é necessária para representar esta relação M:N.
O esquema de mapeamento XSD a seguir fornece uma exibição XML das tabelas usando os elementos <Student>, <Course> e <Enrollment>. Os atributos IDREFS no esquema de mapeamento especificam a relação entre esses elementos. O atributo StudentIDList no elemento <Course> é um atributo do tipo IDREFS que se refere à coluna StudentID na tabela Enrollment. Da mesma forma, o atributo EnrolledIn no <Student> é um atributo do tipo IDREFS que se refere à coluna CourseID na tabela 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>
Sempre que você especifica este esquema em um diagrama de atualização e insere um registro na tabela Course, o diagrama de atualização insere um novo registro de curso na tabela Course. Se você especificar um ou mais novos IDs de aluno para o atributo StudentIDList, o diagrama de atualização também inserirá um registro na tabela Enrollment para cada novo aluno. O diagrama de atualização garante que nenhuma duplicata seja adicionada à tabela Enrollment.
Para testar o diagrama de atualização
Crie estas tabelas no banco de dados que é especificado na raiz virtual:
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))
Adicione estes dados de exemplo:
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')
Copie o esquema de mapeamento acima e cole-o em um arquivo de texto. Salve o arquivo como SampleSchema.xml.
Salve o diagrama de atualização (SampleUpdategram) na mesma pasta usada para salvar o esquema de mapeamento na etapa anterior. (Esse diagrama de atualização descarta um aluno com StudentID = "1" do curso 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>
Crie e use o Script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o diagrama de atualização.
Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.
Salve e execute o diagrama de atualização a seguir como descrito nas etapas anteriores. O diagrama de atualização adiciona o aluno com StudentID = "1" novamente ao curso CS102 adicionando um registro na tabela 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>
Salve e execute este próximo diagrama de atualização como descrito nas etapas anteriores. Esse diagrama de atualização insere três alunos novos e os matricula no curso CS101. Novamente, a relação de IDREFS insere registros na tabela 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>
Este é o esquema XDR equivalente:
<?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>
Para obter mais exemplos de diagramas de atualização que usam esquemas de mapeamento, consulte Especificando um esquema de mapeamento anotado em um diagrama de atualização (SQLXML 4.0).