Especificando um esquema de mapeamento anotado em um diagrama de atualização (SQLXML 4.0)
Aplica-se a: SQL Server Banco de Dados SQL do Azure
Este tópico explica como o esquema de mapeamento (XSD ou XDR), especificado em um diagrama de atualização, é usado para processar as atualizações. Em um updategram, você pode fornecer o nome de um esquema de mapeamento anotado a ser usado no mapeamento dos elementos e atributos no updategram para tabelas e colunas no Microsoft SQL Server. Quando um esquema de mapeamento é especificado em um diagrama de atualização, os nomes de elementos e atributos especificados no diagrama deverão ser mapeados para os elementos e atributos do esquema de mapeamento.
Para especificar um esquema de mapeamento, use o atributo mapping-schema do <elemento sync> . Os exemplos a seguir mostram dois diagramas de atualização: um que usa um esquema de mapeamento simples e outro que usa um esquema mais complexo.
Observação
Esta documentação pressupõe que você esteja familiarizado com modelos e suporte a esquema de mapeamento no SQL Server. Para obter mais informações, consulte Introdução aos esquemas XSD anotados (SQLXML 4.0). Para aplicativos herdados que usam XDR, consulte Esquemas XDR anotados (preteridos no SQLXML 4.0).
Lidando com tipos de dados
Se o esquema especificar o tipo de dados image, binary ou varbinarySQL Server (usando sql:datatype) e não especificar um tipo de dados XML, o updategram pressupõe que o tipo de dados XML é base binária 64. Se os dados forem do tipo bin.base , você deverá especificar explicitamente o tipo (dt:type=bin.base ou type="xsd:hexBinary").
Se o esquema especificar o tipo de dados XSD dateTime, date ou time , você também deverá especificar o tipo de dados SQL Server correspondente usando sql:datatype="dateTime".
Ao manipular parâmetros do tipo money do SQL Server, você deve especificar explicitamente sql:datatype="money" no nó apropriado no esquema de mapeamento.
Exemplos
Para criar exemplos de trabalho usando os exemplos a seguir, você deve atender aos requisitos especificados em Requisitos para executar exemplos de SQLXML.
R. Criando um diagrama de atualização com um esquema de mapeamento simples
O esquema XSD (SampleSchema.xml) a seguir é um esquema de mapeamento que mapeia o <elemento Customer> para a tabela Sales.Customer:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Customer" sql:relation="Sales.Customer" >
<xsd:complexType>
<xsd:attribute name="CustID"
sql:field="CustomerID"
type="xsd:string" />
<xsd:attribute name="RegionID"
sql:field="TerritoryID"
type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
O diagrama de atualização a seguir insere um registro na tabela Sales.Customer e usa o esquema de mapeamento anterior para mapear adequadamente esses dados para a tabela. Observe que o updategram usa o mesmo nome de elemento, <Customer>, conforme definido no esquema. Isso é obrigatório porque o diagrama especifica um esquema específico.
Para testar o diagrama de atualização
Copie o código de esquema acima e cole-o em um arquivo de texto. Salve o arquivo como SampleUpdateSchema.xml.
Copie o modelo de diagrama abaixo e cole-o em um arquivo de texto. Salve o arquivo como SampleUpdategram.xml no mesmo diretório em que você salvou SampleUpdateSchema.xml.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <updg:sync mapping-schema="SampleUpdateSchema.xml"> <updg:before> <Customer CustID="1" RegionID="1" /> </updg:before> <updg:after> <Customer CustID="1" RegionID="2" /> </updg:after> </updg:sync> </ROOT>
O caminho de diretório especificado para o esquema de mapeamento (SampleUpdateSchema.xml) é relativo ao diretório onde o modelo foi salvo. Também é possível especificar um caminho absoluto, por exemplo:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
Crie e use o script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.
Para obter mais informações, consulte Usar o ADO para executar consultas SQLXML 4.0.
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="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustID" />
<AttributeType name="RegionID" />
<attribute type="CustID" sql:field="CustomerID" />
<attribute type="RegionID" sql:field="TerritoryID" />
</ElementType>
</Schema>
B. Inserindo um registro usando a relação pai-filho especificada no esquema de mapeamento
Elementos de esquema podem ser relacionados. O <elemento sql:relationship> especifica a relação pai-filho entre os elementos de esquema. Essas informações são usadas para atualizar as tabelas correspondentes que têm relação chave primária/chave estrangeira.
O seguinte esquema de mapeamento (SampleSchema.xml) consiste em dois elementos, <Order> e <OD:>
<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="OrderOD"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" >
<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:schema>
O updategram a seguir usa esse esquema XSD para adicionar um novo registro de detalhes do pedido (um <elemento OD> no bloco posterior>) para o <pedido 43860. O atributo mapping-schema é usado para especificar o esquema de mapeamento no updategram.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleUpdateSchema.xml" >
<updg:before>
<Order SalesOrderID="43860" />
</updg:before>
<updg:after>
<Order SalesOrderID="43860" >
<OD ProductID="753" UnitPrice="$10.00"
Quantity="5" Discount="0.0" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
Para testar o diagrama de atualização
Copie o código de esquema acima e cole-o em um arquivo de texto. Salve o arquivo como SampleUpdateSchema.xml.
Copie o modelo de diagrama de atualização acima e cole-o em um arquivo de texto. Salve o arquivo como SampleUpdategram.xml no mesmo diretório em que você salvou SampleUpdateSchema.xml.
O caminho de diretório especificado para o esquema de mapeamento (SampleUpdateSchema.xml) é relativo ao diretório onde o modelo foi salvo. Também é possível especificar um caminho absoluto, por exemplo:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
Crie e use o script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.
Para obter mais informações, consulte Usar o ADO para executar consultas SQLXML 4.0.
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="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<AttributeType name="UnitPrice" dt:type="fixed.14.4" />
<AttributeType name="OrderQty" />
<AttributeType name="UnitPriceDiscount" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
<attribute type="UnitPrice" />
<attribute type="OrderQty" />
<attribute type="UnitPriceDiscount" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
<AttributeType name="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
<element type="OD" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail" />
</element>
</ElementType>
</Schema>
C. Inserindo um registro usando a relação pai-filho e a anotação de inverso especificada no esquema XSD
Este exemplo ilustra como a lógica updategram usa a relação pai-filho especificada no XSD para processar atualizações e como a anotação inversa é usada. Para obter mais informações sobre a anotação inversa, consulte Especificando o atributo sql:inverse em sql:relationship (SQLXML 4.0).
Este exemplo pressupõe que as seguintes tabelas estejam no banco de dados tempdb :
Cust (CustomerID, CompanyName)
, ondeCustomerID
é a chave primáriaOrd (OrderID, CustomerID)
, ondeCustomerID
é uma chave estrangeira que recorre à chave primáriaCustomerID
na tabelaCust
.
O diagrama de atualização usa o seguinte esquema XSD para inserir registros nas tabelas Cust e Ord:
<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="OrdCust" inverse="true"
parent="Ord"
parent-key="CustomerID"
child-key="CustomerID"
child="Cust"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Ord">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Customer" sql:relationship="OrdCust"/>
</xsd:sequence>
<xsd:attribute name="OrderID" type="xsd:int"/>
<xsd:attribute name="CustomerID" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Customer" sql:relation="Cust">
<xsd:complexType>
<xsd:attribute name="CustomerID" type="xsd:string"/>
<xsd:attribute name="CompanyName" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
O esquema XSD neste exemplo tem <os elementos Customer> e <Order> e especifica uma relação pai-filho entre os dois elementos. Ele identifica <Order> como o elemento pai e <Customer> como o elemento filho.
A lógica de processamento do diagrama de atualização usa as informações sobre a relação pai-filho para determinar a ordem na qual os registros são inseridos nas tabelas. Neste exemplo, a lógica updategram primeiro tenta inserir um registro na tabela Ord (porque <Order> é o pai) e, em seguida, tenta inserir um registro na tabela Cust (porque< Customer> é o filho). No entanto, devido às informações de chave primária/chave estrangeira contidas no esquema da tabela do banco de dados, esta operação de inserção gera um erro de violação de chave estrangeira no banco de dados e a inserção não é bem sucedida.
Para instruir a lógica updategram a reverter a relação pai-filho durante a operação de atualização, a anotação inversa <é especificada no elemento de relação.> Como resultado, os registros são adicionados primeiro na tabela Cust e, depois, na tabela Ord, e a operação é bem-sucedida.
O seguinte diagrama de atualização insere um pedido (OrderID=2) na tabela Ord e um cliente (CustomerID='AAAAA') na tabela Cust usando o esquema XSD especificado:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleUpdateSchema.xml" >
<updg:before/>
<updg:after>
<Order OrderID="2" CustomerID="AAAAA" >
<Customer CustomerID="AAAAA" CompanyName="AAAAA Company" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
Para testar o diagrama de atualização
Crie estas tabelas no banco de dados tempdb :
USE tempdb CREATE TABLE Cust(CustomerID varchar(5) primary key, CompanyName varchar(20)) GO CREATE TABLE Ord (OrderID int primary key, CustomerID varchar(5) references Cust(CustomerID)) GO
Copie o código de esquema acima e cole-o em um arquivo de texto. Salve o arquivo como SampleUpdateSchema.xml.
Copie o modelo de diagrama de atualização acima e cole-o em um arquivo de texto. Salve o arquivo como SampleUpdategram.xml no mesmo diretório em que você salvou SampleUpdateSchema.xml.
O caminho de diretório especificado para o esquema de mapeamento (SampleUpdateSchema.xml) é relativo ao diretório onde o modelo foi salvo. Também é possível especificar um caminho absoluto, por exemplo:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
Crie e use o script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.
Para obter mais informações, consulte Usar o ADO para executar consultas SQLXML 4.0.
Confira também
Considerações sobre segurança para diagramas de atualização (SQLXML 4.0)