Partilhar via


Especificação de um Esquema de Mapeamento Anotado num Updategram (SQLXML 4.0)

Aplica-se a:SQL ServerBanco de Dados SQL do Azure

Este tópico explica como o esquema de mapeamento (XSD ou XDR) especificado num updategram é usado para processar as atualizações. Num updategram, pode fornecer o nome de um esquema de mapeamento anotado para usar no mapeamento dos elementos e atributos do updategram para tabelas e colunas no Microsoft SQL Server. Quando um esquema de mapeamento é especificado num updategram, os nomes dos elementos e atributos especificados no updategram devem mapear para os elementos e atributos do esquema de mapeamento.

Para especificar um esquema de mapeamento, utiliza-se o atributo mapeamento-schema do <elemento sync> . Os exemplos seguintes mostram dois updategrams: um que usa um esquema de mapeamento simples e outro que usa um esquema mais complexo.

Observação

Esta documentação assume que está familiarizado com modelos e suporte a esquemas de mapeamento no SQL Server. Para mais informações, consulte Introdução aos Esquemas XSD Anotados (SQLXML 4.0). Para aplicações legadas que utilizam XDR, veja Annotated XDR Schemas (Descontinuados no SQLXML 4.0).

Lidar com Tipos de Dados

Se o esquema especificar o tipo de dados imagem, binário ou varbináriodo SQL Server (usando sql:datatype) e não especificar um tipo de dado XML, o updategram assume que o tipo de dado XML é base binária 64. Se os seus dados forem do tipo bin.base, deve especificar explicitamente o tipo (dt:type=bin.base ou type="xsd:hexBinary").

Se o esquema especificar o tipo de dado XSD dataTime, data ou hora, deve também especificar o tipo de dado SQL Server correspondente usando sql:datatype="dateTime".

Ao manipular parâmetros do tipo dinheiro do SQL Server, deve especificar explicitamente sql:datatype="money" no nó apropriado no esquema de mapeamento.

Examples

Para criar exemplos de trabalho usando os exemplos a seguir, você deve atender aos requisitos especificados em Requisitos para execução de exemplos SQLXML.

A. Criar um updategram com um esquema de mapeamento simples

O seguinte esquema XSD (SampleSchema.xml) é um esquema de mapeamento que mapeia o <elemento Cliente> 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 updategram seguinte insere um registo na tabela Sales.Customer e baseia-se no esquema de mapeamento anterior para mapear corretamente estes dados para a tabela. Note que o updategram usa o mesmo nome do elemento, <Customer>, conforme definido no esquema. Isto é obrigatório porque o updategram especifica um esquema específico.

Para testar o updategram
  1. Copie o código do esquema acima e cole num ficheiro de texto. Guarde o ficheiro como SampleUpdateSchema.xml.

  2. Copie o modelo de updategram abaixo e cole-o num ficheiro de texto. Guarda o ficheiro como SampleUpdategram.xml no mesmo diretório onde guardaste 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 do diretório especificado para o esquema de mapeamento (SampleUpdateSchema.xml) é relativo ao diretório onde o modelo é guardado. Um caminho absoluto também pode ser especificado, por exemplo:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. 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. Inserir um registo usando a relação pai-filho especificada no esquema de mapeamento

Os elementos de esquema podem estar relacionados. O <elemento sql:relationship> especifica a relação pai-filho entre os elementos do esquema. Esta informação é usada para atualizar tabelas correspondentes que têm relação de chave primária/chave estrangeira.

O seguinte esquema de mapeamento (SampleSchema.xml) consiste em dois elementos, <Ordem> 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 seguinte utiliza este esquema XSD para adicionar um novo registo de detalhamento de ordem (um <elemento OD> no <bloco posterior> ) para a ordem 43860. O atributo schema de mapeamento é 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 updategram
  1. Copie o código do esquema acima e cole num ficheiro de texto. Guarde o ficheiro como SampleUpdateSchema.xml.

  2. Copia o modelo de updategram acima e cola-o num ficheiro de texto. Guarda o ficheiro como SampleUpdategram.xml no mesmo diretório onde guardaste SampleUpdateSchema.xml.

    O caminho do diretório especificado para o esquema de mapeamento (SampleUpdateSchema.xml) é relativo ao diretório onde o modelo é guardado. Um caminho absoluto também pode ser especificado, por exemplo:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. 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. Inserir um registo usando a relação pai-filho e a anotação inversa especificada no esquema XSD

Este exemplo ilustra como a lógica updategram utiliza a relação pai-filho especificada no XSD para processar atualizações, e como a anotação inversa é utilizada. Para mais informações sobre a anotação inversa, veja Especificar o atributo sql:inverse on sql:relationship (SQLXML 4.0).

Este exemplo assume que as seguintes tabelas estão na base de dados tempdb :

  • Cust (CustomerID, CompanyName), onde CustomerID é a tonalidade primária

  • Ord (OrderID, CustomerID), onde CustomerID é uma chave estrangeira que se refere à CustomerID chave primária na Cust tabela.

O updategram utiliza o seguinte esquema XSD para inserir registos 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. Identifica a< Ordem> como elemento pai e <o Cliente> como o elemento filho.

A lógica de processamento do updategram utiliza a informação sobre a relação pai-filho para determinar a ordem em que os registos são inseridos nas tabelas. Neste exemplo, a lógica do updategram tenta primeiro inserir um registo na tabela Ord (porque <Order> é o pai) e depois tenta inserir um registo na tabela Cust (porque <o Cliente> é o filho). No entanto, devido à informação da chave primária/chave estrangeira contida no esquema da tabela da base de dados, esta operação de inserção causa uma violação de chave estrangeira na base de dados e a inserção falha.

Para instruir a lógica do updategram a inverter 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 registos são adicionados primeiro na tabela Cust e depois na tabela Ord, e a operação tem sucesso.

O seguinte updategram insere uma ordem (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 updategram
  1. Crie estas tabelas na base 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  
    
  2. Copie o código do esquema acima e cole num ficheiro de texto. Guarde o ficheiro como SampleUpdateSchema.xml.

  3. Copia o modelo de updategram acima e cola-o num ficheiro de texto. Guarda o ficheiro como SampleUpdategram.xml no mesmo diretório onde guardaste SampleUpdateSchema.xml.

    O caminho do diretório especificado para o esquema de mapeamento (SampleUpdateSchema.xml) é relativo ao diretório onde o modelo é guardado. Um caminho absoluto também pode ser especificado, por exemplo:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  4. 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.

Ver também

Considerações de segurança do Updategram (SQLXML 4.0)