Especificando um esquema de mapeamento anotado em um diagrama de atualização (SQLXML 4.0)
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 mapping-schema
atributo do elemento de< sincronização>. 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 esquemas de mapeamento em 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 image
tipo de dados , binary
ou varbinary
SQL Server (usando sql:datatype
) e não especificar um tipo de dados XML, o updategram pressupõe que o tipo de dados XML seja binary base 64
. Se seus 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 dateTime
tipo de dados , date
ou time
XSD, você também deverá especificar o tipo de dados SQL Server correspondente usando sql:datatype="dateTime"
.
Ao lidar com parâmetros de SQL Server money
tipo, você deve especificar sql:datatype="money"
explicitamente 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 SQLXML.
a. Criando um diagrama de atualização com um esquema de mapeamento simples
O seguinte esquema XSD (SampleSchema.xml) é 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 Usando 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 esquema de mapeamento a seguir (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 de pedido (um <elemento OD> no bloco após>) para a< ordem 43860. O atributo mapping-schema
é usado para especificar o esquema de mapeamento no diagrama.
<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 Usando 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 de diagrama de atualização usa a relação pai-filho especificada no XSD para processar atualizações e como a anotação inverse
é usada. Para obter mais informações sobre a inverse
anotação, 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 <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 do 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 do updategram a reverter a relação pai-filho durante a operação de atualização, a inverse
anotação é especificada no <elemento relationship> . 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 Usando o ADO para executar consultas SQLXML 4.0.
Consulte Também
Considerações sobre segurança para diagramas de atualização (SQLXML 4.0)