Compartilhar via


Introdução aos updategramas (SQLXML 4.0)

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

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 é mais apropriado sempre que provedores de conjunto de linhas, como uma tabela, podem aparecer como uma origem.

Assim como OPENXML, um diagrama de atualização permite inserir, atualizar ou excluir dados no banco de dados; no entanto, um diagrama de atualização funciona em relação às exibições XML fornecidas pelo esquema XSD (ou XDR) anotado; por exemplo, as atualizações são aplicadas à exibição XML fornecida pelo esquema de mapeamento. O esquema de mapeamento, por sua vez, tem as informações necessárias para mapear elementos XML e atributos para as tabelas e colunas de banco de dados correspondentes. O updategram usa essas informações de mapeamento para atualizar as tabelas e colunas do banco de dados.

Observação

Esta documentação pressupõe que você esteja familiarizado com modelos e suporte a esquemas 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).

Namespaces necessários no updategram

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

Revisão da sintaxe

Um updategram é um modelo com <sincronização>, <antes> e <depois> de blocos que formam a sintaxe do updategram. O código a seguir mostra essa 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 definições a seguir descrevem a função de cada um desses blocos:

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

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

<sincronizar>
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 updategrama executará uma operação de exclusão.

  • Se uma instância de registro aparecer somente no <bloco posterior> sem 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 updategram

Em um diagrama de atualização, a abstração XML fornecida por um esquema de mapeamento (há suporte para esquemas XSD e XDR) pode ser implícita ou explícita (ou seja, um updategrama pode funcionar com ou sem um esquema de mapeamento especificado). Se você não especificar um esquema de mapeamento, o diagrama de atualização assumirá um mapeamento implícito (o mapeamento padrão), em que cada elemento no <bloco antes> ou <depois> do bloco é 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 updategram deverão corresponder aos elementos e atributos no esquema de mapeamento.

Mapeamento implícito (padrão)

Na maioria dos casos, um updategram que executa atualizações simples pode não exigir um esquema de mapeamento. Nesse caso, o updategram depende do esquema de mapeamento padrão.

O diagrama de atualização a seguir demonstra o mapeamento implícito. Neste exemplo, o updategram insere um novo cliente na tabela Sales.Customer. Como esse programa de atualização 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 de banco de dados que devem ser atualizadas.

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 mapping-schema atributo no qual o updategrama é 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 de modelo (em relação ao local em que o diagrama de atualização é armazenado). Para obter mais informações, consulte Especificando um esquema de mapeamento anotado em um updategrama (SQLXML 4.0).

Mapeamento centrado em elementos e centrado em atributos em updategrams

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 de mapeamento centrado em elemento) e os atributos (no caso do mapeamento centrado em atributo) são mapeados para colunas.

Mapeamento centrado em elementos

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

Como esse diagrama de atualização não especifica um esquema de mapeamento, o updategrama 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 diagrama de atualização a seguir usa o 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 na 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 mapeamento centrado em elementos e centrado em atributos

Você pode especificar uma combinação de mapeamento centrado em elemento e centrado em atributo, conforme mostrado no diagrama de atualização a seguir. Observe que o <elemento Person.Contact> contém um atributo e um elemento filho. Além disso, esse diagrama de atualização depende do 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

No SQL Server, os nomes de tabela podem incluir um espaço. No entanto, esse tipo de nome de tabela não é válido em XML.

Para codificar caracteres que são identificadores válidos do SQL Server, mas não são identificadores XML válidos, use '__xHHHH__' como o valor de codificação, em que HHHH 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] no 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_>, em que _x005B_ é a codificação para o colchete esquerdo ([) e _x005D_ é a codificação para o colchete direito (]).

Executando updategrams

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 updategram de qualquer uma das seguintes maneiras:

  • Enviando-o em um comando do ADO.

  • Enviando-o como um comando OLE DB.

Consulte Também

Considerações sobre segurança do updategram (SQLXML 4.0)