Introdução aos diagramas de atualização (SQLXML 4.0)

Aplica-se ao:yesSQL Server (todas as versões com suporte) YesBanco de Dados SQL do Azure

Você pode modificar (inserir, atualizar ou excluir) um banco de dados em Microsoft SQL Server de um documento XML existente usando um updategram ou a função OPENXML Transact-SQL.

A função OPENXML modifica um banco de dados fragmentando o documento XML existente e fornecendo um conjunto de linhas que pode ser passado para uma instrução INSERT, UPDATE ou DELETE. Com OPENXML, as operações são executadas diretamente nas tabelas de banco de dados. Portanto, OPENXML é especialmente apropriada nos casos em que provedores de conjuntos de linhas, como uma tabela, possam aparecer como uma origem.

Da mesma forma que a OPENXML, um diagrama de atualização permite inserir, atualizar ou excluir dados no banco de dados. Entretanto, ele trabalha nas exibições em XML fornecidas pelo esquema XSD (ou um XDR) anotado; por exemplo, as atualizações são aplicadas à exibição em XML fornecida pelo esquema de mapeamento. O esquema de mapeamento, por sua vez, tem as informações necessárias para mapear elementos e atributos XML para as tabelas e colunas de bancos de dados correspondentes. O diagrama de atualização usa estas informações de mapeamento para atualizar as tabelas e colunas de bancos de dados.

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 a esquemas XSD anotados (SQLXML 4.0). Para aplicativos herdados que usam XDR, consulte Esquemas XDR anotados (preteridos no SQLXML 4.0).

Namespaces necessários no diagrama de atualização

As palavras-chave em um updategram, como <sincronização>, <antes> e <depois>, existem no namespace urn:schemas-microsoft-com:xml-updategram . O prefixo de namespace utilizado é arbitrário. Nesta documentação, o prefixo updg indica o namespace do updategram .

Revisando a sintaxe

Um updategram é um modelo com <sincronização>, <antes> e <depois> de blocos que formam a sintaxe do updategram. O seguinte código mostra esta sintaxe em sua forma mais simples:

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
  <updg:sync [mapping-schema= "AnnotatedSchemaFile.xml"] >  
    <updg:before>  
        ...  
    </updg:before>  
    <updg:after>  
        ...  
    </updg:after>  
  </updg:sync>  
</ROOT>  

As seguintes definições descrevem a função de cada um destes blocos:

<Antes>
Identifica o estado existente (também chamado de "o estado antes") da instância de registro.

<Depois>
Identifica o estado novo para o qual dados devem ser alterados.

<Sincronização>
Contém os <blocos antes> e <depois> . Um <bloco de sincronização> pode conter mais de um conjunto de <blocos antes> e <depois> . Se houver mais de um conjunto de <blocos antes> e <depois> , esses blocos (mesmo que estejam vazios) deverão ser especificados como pares. Além disso, um updategram pode ter mais de um <bloco de sincronização> . Cada <bloco de sincronização> é uma unidade de transação (o que significa que tudo no <bloco de sincronização> é feito ou nada é feito). Se você especificar vários blocos <de sincronização> em um updategram, a falha de um <bloco de sincronização> não afetará os outros <blocos de sincronização> .

Se um updategram exclui, insere ou atualiza uma instância de registro depende do conteúdo dos <blocos antes> e <depois> :

  • Se uma instância de registro aparecer somente no <bloco anterior> sem nenhuma instância correspondente no bloco após>,< o updategram executará uma operação de exclusão.

  • Se uma instância de registro aparecer somente no <bloco após> não ter nenhuma instância correspondente no <bloco anterior> , ela será uma operação de inserção.

  • Se uma instância de registro aparecer no <bloco anterior> e tiver uma instância correspondente no bloco após>,< ela será uma operação de atualização. Nesse caso, o updategram atualiza a instância de registro para os valores especificados no <bloco após> .

Especificando um esquema de mapeamento no diagrama de atualização

Em um diagrama de atualização, a abstração XML que é fornecida por um esquema de mapeamento (é dado suporte a esquemas XSD e também XDR) pode ser implícita ou explícita (ou seja, um diagrama de atualização pode funcionar com ou sem um esquema de mapeamento especificado). Se você não especificar um esquema de mapeamento, o updategram pressupõe um mapeamento implícito (o mapeamento padrão), em que cada elemento no <bloco anterior> ou <depois> é mapeado para uma tabela e o elemento filho de cada elemento ou atributo é mapeado para uma coluna no banco de dados. Se você especificar explicitamente um esquema de mapeamento, os elementos e atributos no diagrama de atualização deverão corresponder aos elementos e atributos no esquema de mapeamento.

Mapeamento implícito (padrão)

Na maioria dos casos, um diagrama de atualização que executa atualizações simples pode não precisar de um esquema de mapeamento. Neste caso, o diagrama de atualização se baseia no esquema de mapeamento padrão.

O seguinte diagrama de atualização demonstra o mapeamento implícito. Neste exemplo, o diagrama de atualização insere um novo cliente na tabela Sales.Customer. Como esse updategram usa mapeamento implícito, o <elemento Sales.Customer> é mapeado para a tabela Sales.Customer e os atributos CustomerID e SalesPersonID são mapeados para as colunas correspondentes na tabela Sales.Customer.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
<updg:before>  
</updg:before>  
<updg:after>  
    <Sales.Customer CustomerID="1" SalesPersonID="277" />  
    </updg:after>  
</updg:sync>  
</ROOT>  

Mapeamento explícito

Se você especificar um esquema de mapeamento (XSD ou XDR), o diagrama de atualização usará o esquema para determinar as tabelas e colunas do banco de dados que deverão ser atualizados.

Se o updategram executar uma atualização complexa (por exemplo, inserir registros em várias tabelas com base na relação pai-filho especificada no esquema de mapeamento), você deverá fornecer explicitamente o esquema de mapeamento usando o atributo mapeamento-esquema no qual o updategram é executado.

Como um diagrama de atualização é um modelo, o caminho especificado para o esquema de mapeamento no diagrama de atualização é relativo ao local do arquivo do modelo (relativo ao local onde o diagrama de atualização está armazenado). Para obter mais informações, consulte Especificando um esquema de mapeamento anotado em um updategram (SQLXML 4.0).

Mapeamento centrado em elemento e mapeamento centrado em atributo em diagramas de atualização

Com o mapeamento padrão (quando o esquema de mapeamento não é especificado no updategram), os elementos de updategrama são mapeados para tabelas e os elementos filho (no caso do mapeamento centrado em elemento) e os atributos (no caso do mapeamento centrado em atributo) são mapeados para colunas.

Mapeamento centrado em elemento

Em um diagrama de atualização centrado em elemento, um elemento contém elementos filhos que denotam as propriedades do elemento. Como um exemplo, consulte o seguinte diagrama de atualização. O <elemento Person.Contact> contém os <elementos filho FirstName> e <LastName> . Esses elementos filho são propriedades do <elemento Person.Contact> .

Como esse updategram não especifica um esquema de mapeamento, o updategram usa mapeamento implícito, em que o <elemento Person.Contact> é mapeado para a tabela Person.Contact e seus elementos filho são mapeados para as colunas FirstName e LastName.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:after>  
    <Person.Contact>  
       <FirstName>Catherine</FirstName>  
       <LastName>Abel</LastName>  
    </Person.Contact>  
  </updg:after>  
</updg:sync>  
</ROOT>  

mapeamento centrado em atributo

Em um mapeamento centrado em atributo, os elementos têm atributos. O seguinte diagrama de atualização usa mapeamento centrado em atributo. Neste exemplo, o <elemento Person.Contact> consiste nos atributos FirstName e LastName . Esses atributos são as propriedades do <elemento Person.Contact> . Como no exemplo anterior, este updategram não especifica nenhum esquema de mapeamento, portanto, ele se baseia no mapeamento implícito para mapear o <elemento Person.Contact> para a tabela Person.Contact e os atributos do elemento para as respectivas colunas da tabela.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:before>  
  </updg:before>  
  <updg:after>  
    <Person.Contact FirstName="Catherine" LastName="Abel" />  
  </updg:after>  
</updg:sync>  
</ROOT>  

Usando o mapeamento centrado em elemento e centrado em atributo

Você pode especificar uma mistura de mapeamento centrado em elemento e mapeamento centrado em atributo, conforme mostrado no seguinte diagrama de atualização. Observe que o <elemento Person.Contact> contém um atributo e um elemento filho. Além disso, este diagrama de atualização se baseia em mapeamento implícito. Assim, o atributo FirstName e o <elemento filho LastName são> mapeados para colunas correspondentes na tabela Person.Contact.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:before>  
  </updg:before>  
  <updg:after>  
    <Person.Contact FirstName="Catherine" >  
       <LastName>Abel</LastName>  
    </Person.Contact>  
  </updg:after>  
</updg:sync>  
</ROOT>  

Trabalhando com caracteres válidos no SQL Server, mas não válidos em XML

Em SQL Server, os nomes de tabela podem incluir um espaço. Porém, este tipo de nome de tabela não é válido em XML.

Para codificar caracteres válidos SQL Server identificadores, mas não são identificadores XML válidos, use '__xHHHH__' como o valor de codificação, em que HHHHH significa o código UCS-2 hexadecimal de quatro dígitos para o caractere na ordem de primeiro bit mais significativa. Usando esse esquema de codificação, um caractere de espaço é substituído por x0020 (o código hexadecimal de quatro dígitos para um caractere de espaço); assim, o nome da tabela [Detalhes do Pedido] em SQL Server torna-se _x005B_Order_x0020_Details_x005D_ em XML.

Da mesma forma, talvez seja necessário especificar nomes de elementos de três partes, como <[banco de dados].[ proprietário]. [tabela]>. Como os caracteres de colchete ([ e ]) não são válidos em XML, você deve especificar isso como <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>, onde _x005B_ é a codificação para o colchete esquerdo ([) e _x005D_ é a codificação para o colchete direito (]).

Executando diagramas de atualização

Como um diagrama de atualização é um modelo, todos os mecanismos de processamento de um modelo se aplicam ao diagrama de atualização. Para SQLXML 4.0, você pode executar um diagrama de atualização em qualquer um dos seguintes modos:

  • Enviando-o em um comando ADO.

  • Enviando-o como um comando OLE DB.

Consulte Também

Considerações sobre segurança para diagramas de atualização (SQLXML 4.0)