Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Ao atualizar dados existentes, deve especificar tanto os <blocos antes> como <depois> . Os elementos especificados nos blocos< antes> e <depois> descrevem a alteração desejada. O updategram utiliza o(s) elemento(s) especificado(s) no <bloco antes> para identificar o(s) registo(s) existente(s) na base de dados. O(s) elemento(s) correspondente(s) no <bloco posterior> indicam como os registos devem ficar após a execução da operação de atualização. A partir desta informação, o updategram cria uma instrução SQL que corresponde ao <bloco after> . O updategram usa então esta instrução para atualizar a base de dados.
Este é o formato de updategram 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>
<atualização:antes>
Os elementos no <bloco antes> identificam registos existentes nas tabelas da base de dados.
<atualização:depois>
Os elementos no <bloco posterior> descrevem como os registos especificados no <bloco antes> devem ser apresentados após a aplicação das atualizações.
O atributo schema de mapeamento identifica o esquema de mapeamento a ser utilizado pelo updategram. Se o updategram especificar um esquema de mapeamento, os nomes dos elementos e atributos especificados nos <blocos antes> e <depois> devem corresponder aos nomes no esquema. O esquema de mapeamento mapeia estes nomes de elementos ou atributos para os nomes da tabela e coluna da base de dados.
Se um updategram não especificar um esquema, o updategam usa o mapeamento padrão. No mapeamento por defeito, o <ElementName> especificado no updategram mapeia para a tabela da base de dados e os elementos ou atributos filhos mapeiam para as colunas da base de dados.
Um elemento no <bloco antes> deve corresponder apenas a uma linha da tabela na base de dados. Se o elemento coincidir com várias linhas de tabela ou não corresponder a nenhuma linha, o updategram devolve um erro e cancela todo <o bloco de sincronização> .
Um updategram pode incluir múltiplos <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 estiver a atualizar dois dos registos existentes, pode especificar dois <pares antes> e <depois> , um para cada registo a ser atualizado.
Usando o atributo atualização: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 utiliza esta informação para determinar que registo no <bloco antes> se emparelha com que registo no <bloco seguinte> .
O atributo updg:id não é necessário (embora recomendado) se existir algum dos seguintes requisitos:
Os elementos no esquema de mapeamento especificado têm o atributo sql:key-fields definido neles.
Existe um ou mais valores específicos fornecidos para o(s) campo(s) chave no updategram.
Se algum for o caso, o updategram utiliza as colunas chave especificadas nos campos sql:key para emparelhar os elementos nos <blocos antes> e <depois> .
Se o esquema de mapeamento não identificar colunas chave (usando sql:key-fields) ou se o updategram estiver a atualizar o valor de uma coluna chave, deve especificar updg:id.
Os registos identificados nos blocos< antes> e <depois> não têm de estar na mesma ordem. O atributo updg:id força a associação entre os elementos especificados nos <blocos antes> e <depois> .
Se especificar um elemento no <bloco antes> e apenas um elemento correspondente no <bloco seguinte> , usar o updg:id não é necessário. No entanto, recomenda-se que especifique o "updg:id " para evitar ambiguidades.
Examples
Antes de usar os exemplos de updategram, note 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 utiliza a base de dados de exemplos AdventureWorks. Todas as atualizações são aplicadas às tabelas neste banco de dados. Pode restaurar a base de dados do AdventureWorks.
A. Atualização de um registo
O seguinte updategram atualiza o apelido do funcionário para Fuller na tabela Person.Contact na base de dados AdventureWorks. O updategram não especifica qualquer esquema de mapeamento; Por isso, o updategram utiliza o mapeamento por defeito.
<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 registo descrito no <bloco antes> representa o registo atual na base de dados. O updategram utiliza todos os valores das colunas especificados no <bloco antes> para procurar o registo. Neste updategram, o <bloco antes> fornece apenas a coluna ContactID; portanto, o updategram usa apenas o valor para procurar o registo. Se adicionasse o valor Último Nome a este bloco, o updategram usaria tanto os valores ContactID como Apelido para pesquisar.
Neste updategram, o <bloco After> fornece apenas o valor da coluna Último Nome porque este é o único valor que está a ser alterado.
Para testar o updategram
Copia o modelo de updategram acima e cola-o num ficheiro de texto. Guarde o ficheiro como UpdateLastName.xml.
Crie e use o Script de Teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o updategram.
Para obter mais informações, consulte Usando o ADO para executar consultas SQLXML 4.0.
B. Atualização de múltiplos registos usando o atributo updg:id
Neste exemplo, o updategram realiza duas atualizações na tabela HumanResources.Shift na base de dados AdventureWorks:
Muda o nome do turno diurno original que começa às 7:00 da manhã de "Dia" para "Manhã Cedo".
Insere um novo turno chamado "Late Morning" que começa às 10:00.
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>
Repare como o atributo updg:id emparelha a primeira instância do <elemento HumanResources.Shift> no <bloco antes> com a segunda instância do <elemento HumanResources.Shift> no <bloco seguinte> .
Para testar o updategram
Copia o modelo de updategram acima e cola-o num ficheiro de texto. Guarde o ficheiro como UpdateMultipleRecords.xml.
Crie e use o Script de Teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o updategram.
Para obter mais informações, consulte Usando o ADO para executar consultas SQLXML 4.0.
C. Especificar múltiplos <blocos antes> e <depois>
Para evitar ambiguidades, pode escrever o updategram no Exemplo B usando múltiplos <pares de blocos antes> e <depois> . Especificar <pares antes> e <depois> é uma forma de especificar múltiplas atualizações com o mínimo de confusão. Além disso, se cada um dos blocos< antes> e <depois> especificar no máximo um elemento, não tens de usar o atributo updg:id.
Observação
Para formar um par, a <etiqueta de depois> deve imediatamente seguir a sua correspondente <etiqueta de antes> .
No updategram seguinte, o primeiro <par antes> e <depois> atualiza o nome do turno diurno. O segundo par insere um novo registo de shift.
<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 updategram
Copia o modelo de updategram acima e cola-o num ficheiro de texto. Guarde o ficheiro como UpdateMultipleBeforeAfter.xml.
Crie e use o Script de Teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o updategram.
Para obter mais informações, consulte Usando o ADO para executar consultas SQLXML 4.0.
D. Especificação de múltiplos <blocos de sincronização>
Podes especificar múltiplos <blocos de sincronização> num updategram. Cada <bloco de sincronização> especificado é uma transação independente.
No updategram seguinte, o primeiro <bloco de sincronização> atualiza um registo na tabela Sales.Customer. Para simplificar, o updategram especifica apenas os valores de coluna necessários; o valor de identidade (CustomerID) e o valor a ser atualizado (SalesPersonID).
O segundo <bloco de sincronização> adiciona dois registos à tabela Sales.SalesOrderHeader. Para esta tabela, SalesOrderID é uma coluna do tipo IDENTITY. Portanto, o updategram não especifica o valor do SalesOrderID em cada um dos <elementos do Sales.SalesOrderHeader> .
Especificar múltiplos <blocos de sincronização> é útil porque, se o segundo <bloco de sincronização> (uma transação) não conseguir adicionar registos à tabela Sales.OrderHeader, o primeiro <bloco de sincronização> ainda pode atualizar o registo 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 updategram
Copia o modelo de updategram acima e cola-o num ficheiro de texto. Guarde o ficheiro como UpdateMultipleSyncs.xml.
Crie e use o Script de Teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o updategram.
Para obter mais informações, consulte Usando o ADO para executar consultas SQLXML 4.0.
E. Utilização de um esquema de mapeamento
Neste exemplo, o updategram especifica um esquema de mapeamento usando o atributo schema de mapeamento . (Não existe mapeamento por defeito; ou seja, o esquema de mapeamento fornece o mapeamento necessário dos elementos e atributos do updategram para as tabelas e colunas da base de dados.)
Os elementos e atributos especificados no updategram referem-se aos elementos e atributos no esquema de mapeamento.
O seguinte esquema de mapeamento XSD tem <elementos Customer>, <Order> e <OD> que correspondem às tabelas Sales.Customer, Sales.SalesOrderHeader e Sales.OrderDetail na base 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 seguinte updategram. O updategram adiciona um item detalhado da encomenda na tabela Sales.SalesOrderDetail para uma encomenda específica. O updategram inclui elementos aninhados: um <elemento OD> aninhado dentro de um <elemento de Ordem> . A relação 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 updategram
Copie o esquema de mapeamento acima e cole num ficheiro de texto. Guarde o ficheiro como UpdategramMappingSchema.xml.
Copia o modelo de updategram acima e cola-o num ficheiro de texto. Guardar o ficheiro como UpdateWithMappingSchema.xml na mesma pasta em que foi usado para guardar o esquema de mapeamento (UpdategramMappingSchema.xml).
Crie e use o Script de Teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o updategram.
Para obter mais informações, consulte Usando o ADO para executar consultas 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. Utilização de um esquema de mapeamento com atributos IDREFS
Este exemplo ilustra como os updategrams utilizam os atributos IDREFS no esquema de mapeamento para atualizar registos em múltiplas tabelas. Para este exemplo, assuma que a base de dados consiste nas seguintes tabelas:
Estudante (StudentID, Apelido)
Curso(CourseID, CourseName)
Matrícula (StudentID, CourseID)
Como um estudante pode inscrever-se em muitos cursos e um curso pode ter muitos alunos, a terceira tabela, a tabela de Inscrição, é necessária para representar esta relação M:N.
O seguinte esquema de mapeamento XSD fornece uma vista XML das tabelas utilizando os <elementos Estudante>, <Curso> e <Matrícula> . Os atributos IDREFS no esquema de mapeamento especificam a relação entre estes elementos. O atributo StudentIDList no <elemento Curso> é um atributo do tipo IDREFS que se refere à coluna StudentID na tabela de Matrícula. Da mesma forma, o atributo EnrolledIn no <elemento Student> é um atributo do tipo IDREFS que se refere à coluna CourseID na tabela de Inscrições.
<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 especifica este esquema num updategram e insere um registo na tabela de cursos, o updategram insere um novo registo de curso na tabela de cursos. Se especificar um ou mais novos IDs de estudante para o atributo StudentIDList, o updategram também insere um registo na tabela de Matrícula para cada novo estudante. O updategram garante que não são adicionados duplicados à tabela de Inscrição.
Para testar o updategram
Crie estas tabelas na base de dados especificada 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 num ficheiro de texto. Guarde o ficheiro como SampleSchema.xml.
Guarde o updategram (SampleUpdategram) na mesma pasta usada para guardar o esquema de mapeamento na etapa anterior. (Este updategram remove um estudante 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 updategram.
Para obter mais informações, consulte Usando o ADO para executar consultas SQLXML 4.0.
Guarde e execute o seguinte updategram conforme descrito nos passos anteriores. O updategram adiciona o estudante com StudentID="1" de volta ao curso CS102, adicionando um registo na tabela de Inscrições.
<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>Guarde e execute este próximo updategram conforme descrito nos passos anteriores. Este updategram insere três novos estudantes e inscreve-os no curso CS101. Mais uma vez, a relação IDREFS insere registos na tabela de Inscrição.
<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).