Atualizando dados que usam diagramas de atualização XML (SQLXML 4.0)
Aplica-se a: SQL Server Banco de Dados SQL do Azure
Ao atualizar dados existentes, você deve especificar os blocos antes> e <depois>.< Os elementos especificados nos blocos antes> e< depois> descrevem a alteração desejada.< O updategram usa o(s) elemento(s) especificado(s) no <bloco anterior> para identificar o(s) registro(s) existente(s) no banco de dados. O(s) elemento(s) correspondente(s) no <bloco after> indicam como os registros devem ficar após a execução da operação de atualização. A partir dessas informações, o updategram 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:antes>
Os elementos no <bloco anterior> identificam registros existentes nas tabelas do banco de dados.
<updg:depois>
Os elementos no <bloco after> descrevem como os registros especificados no< bloco before> devem ficar depois que as atualizações são aplicadas.
O atributo mapping-schema identifica o esquema de mapeamento a ser usado pelo updategram. Se o updategram especificar um esquema de mapeamento, os nomes de elemento e atributo especificados nos blocos antes> e <depois> deverão 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 updategram é mapeado para a tabela do banco de dados e os elementos ou atributos filho são mapeados para as colunas do banco de dados.
Um elemento no <bloco anterior> deve corresponder a apenas uma linha da tabela no banco de dados. Se o elemento corresponder a várias linhas da tabela ou não corresponder a nenhuma linha da tabela, o updategram retornará um erro e cancelará todo <o bloco de sincronização> .
Um updategram pode incluir vários <blocos de sincronização> . Cada <bloco de sincronização> é tratado como uma transação. Cada bloco de sincronização> pode ter vários <blocos antes> e< depois>.< Por exemplo, se você estiver atualizando dois dos registros existentes, poderá especificar dois pares antes> e <depois>, um para cada registro que está sendo atualizado.<
Usando o atributo updg:id
Quando vários elementos são especificados nos <blocos antes> e <depois>, use o atributo updg:id para marcar linhas nos< blocos antes> e< depois.> A lógica de processamento usa essas informações para determinar qual registro no bloco anterior> emparelha< com qual registro no <bloco posterior>.
O atributo updg:id não é necessário (embora recomendado) se uma das seguintes situações existir:
Os elementos no esquema de mapeamento especificado têm 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 for o caso, o updategram usa as colunas de chave especificadas no sql:key-fields para emparelhar os elementos nos <blocos antes> e <depois.>
Se o esquema de mapeamento não identificar colunas de chave (usando sql:key-fields) ou se o updategram estiver atualizando um valor de coluna de chave, você deverá especificar updg:id.
Os registros identificados nos blocos antes> e <depois> não precisam estar na mesma ordem.< O atributo updg:id força a associação entre os elementos especificados nos< blocos antes> e <depois.>
Se você especificar um elemento no <bloco anterior> e apenas um elemento correspondente no <bloco posterior> , o uso de updg:id não será necessário. No entanto, é recomendável especificar 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 updategrams que usam esquemas de mapeamento, consulte Especificando um esquema de mapeamento anotado em um Updategram (SQLXML 4.0).
A maioria dos exemplos usa o banco de dados de exemplo do AdventureWorks. Todas as atualizações são aplicadas às tabelas deste banco de dados. É possível restaurar o banco de dados AdventureWorks.
R. Atualizando um registro
O diagrama de atualização a seguir atualiza o sobrenome do funcionário para Silva na tabela Person.Contact no banco de dados do AdventureWorks. 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.Contact ContactID="1" />
</updg:before>
<updg:after>
<Person.Contact LastName="Abel-Achong" />
</updg:after>
</updg:sync>
</ROOT>
O registro descrito no <bloco anterior> representa o registro atual no banco de dados. O updategram usa todos os valores de coluna especificados no <bloco anterior> para pesquisar o registro. Neste updategram, o <bloco anterior> fornece apenas a coluna ContactID; portanto, o updategram usa apenas o valor para pesquisar o registro. Se você fosse acrescentar o valor LastName a esse bloco, o diagrama de atualização usaria os valores ContactID e LastName para pesquisar.
Neste updategram, o <bloco after> fornece apenas 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 Usar o ADO para executar consultas 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 AdventureWorks:
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 updategram, o atributo updg:id cria associações entre elementos nos <blocos antes> e <depois.>
<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 emparelha a <primeira instância do elemento HumanResources.Shift> no< bloco anterior> com a segunda instância do <elemento HumanResources.Shift> no< bloco posterior.>
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 Usar o ADO para executar consultas SQLXML 4.0.
C. Especificando vários <blocos antes> e <depois>
Para evitar ambiguidade, você pode escrever o updategram no Exemplo B usando vários pares de blocos antes> e <depois>.< Especificar <pares antes> e <depois> é uma maneira de especificar várias atualizações com um mínimo de confusão. Além disso, se cada um dos blocos antes> e <depois> especificar no máximo um elemento, você não precisará usar o atributo updg:id.<
Observação
Para formar um par, a tag after> deve seguir imediatamente sua tag before> correspondente<.<
No updategram a seguir, o primeiro par antes> e< depois> atualiza o nome do turno para o turno diurno.< 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 Usar o ADO para executar consultas SQLXML 4.0.
D. Especificando vários <blocos de sincronização>
Você pode especificar vários <blocos de sincronização> em um updategram. Cada <bloco de sincronização> especificado é uma transação independente.
No updategram a seguir, o primeiro <bloco de sincronização> 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 de sincronização> adiciona dois registros à tabela Sales.SalesOrderHeader. Para esta tabela, SalesOrderID é uma coluna do IDENTITY. Portanto, o updategram não especifica o valor de SalesOrderID em cada um dos <elementos Sales.SalesOrderHeader> .
Especificar vários <blocos de sincronização> é útil porque, se o segundo <bloco de sincronização> (uma transação) não adicionar registros à tabela Sales.SalesOrderHeader, o primeiro <bloco de sincronização> 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"
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>
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 Usar o ADO para executar consultas SQLXML 4.0.
E. Usando um esquema de mapeamento
Neste exemplo, o updategram 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 são mapeados 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 updategram 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 Usar o ADO para executar consultas SQLXML 4.0.
Para obter mais exemplos de updategrams que usam esquemas de mapeamento, consulte Especificando um esquema de mapeamento anotado em um Updategram (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 <elemento 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 Usar o ADO para executar consultas 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 updategrams que usam esquemas de mapeamento, consulte Especificando um esquema de mapeamento anotado em um Updategram (SQLXML 4.0).
Confira também
Considerações sobre segurança para diagramas de atualização (SQLXML 4.0)