Partilhar via


Introdução aos Updategrams (SQLXML 4.0)

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

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

A função OPENXML modifica uma base de dados ao destruir o documento XML existente e fornecer um conjunto de linhas que pode ser passado para uma instrução INSERT, UPDATE ou DELETE. Com o OPENXML, as operações são realizadas diretamente sobre as tabelas da base de dados. Portanto, o OPENXML é mais apropriado sempre que fornecedores de conjuntos de linhas, como uma tabela, possam aparecer como fonte.

Tal como o OPENXML, um updategram permite inserir, atualizar ou eliminar dados na base de dados; no entanto, um updategram funciona contra as vistas XML fornecidas pelo esquema XSD anotado (ou XDR); por exemplo, as atualizações são aplicadas à vista XML fornecida pelo esquema de mapeamento. O esquema de mapeamento, por sua vez, tem a informação necessária para mapear elementos e atributos XML para as respetivas tabelas e colunas da base de dados. O updategram utiliza esta informação de mapeamento para atualizar as tabelas e colunas da base de dados.

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).

Espaços de nomes obrigatórios no Updategram

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

Revisão da Sintaxe

Um updategram é um modelo com <blocos de sincronização>, <antes> e <depois> que formam a sintaxe do updategram. O código seguinte mostra esta sintaxe na 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 o papel de cada um destes blocos:

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

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

<sincronização>
Contém os <blocos antes> e <depois> . Um <bloco de sincronização> pode conter mais do que um conjunto de <blocos antes> e <depois> . Se existirem mais do que um conjunto de <blocos antes> e <depois> , esses blocos (mesmo que estejam vazios) devem ser especificados como pares. Além disso, um updategram pode ter mais do que um <bloco de sincronização> . Cada <bloco de sincronização> é uma unidade de transação (o que significa que ou tudo no <bloco de sincronização> está feito ou nada está feito). Se especificar múltiplos <blocos de sincronização> num updategram, a falha de um <bloco de sincronização> não afeta os outros <blocos de sincronização> .

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

  • Se uma instância de registo aparecer apenas no <bloco antes> sem uma instância correspondente no <bloco seguinte> , o updategram realiza uma operação de eliminação.

  • Se uma instância de registo aparecer apenas no <bloco after> sem uma instância correspondente no <bloco before> , é uma operação de inserção.

  • Se uma instância de registo aparecer no <bloco antes> e tiver uma instância correspondente no <bloco seguinte> , é uma operação de atualização. Neste caso, o updategram atualiza a instância do registo para os valores especificados no <bloco seguinte> .

Especificação de um Esquema de Mapeamento no Updategram

Num updategram, a abstração XML fornecida por um esquema de mapeamento (tanto os esquemas XSD como XDR são suportados) pode ser implícita ou explícita (ou seja, um updategram pode funcionar com ou sem um esquema de mapeamento especificado). Se não especificar um esquema de mapeamento, o updategram assume um mapeamento implícito (o mapeamento padrão), onde cada elemento no <bloco antes> ou <depois> mapeia para uma tabela e o elemento filho ou atributo de cada elemento é mapeado para uma coluna na base de dados. Se especificar explicitamente um esquema de mapeamento, os elementos e atributos no updategram devem corresponder aos elementos e atributos do esquema de mapeamento.

Mapeamento implícito (por defeito)

Na maioria dos casos, um updategram que realiza atualizações simples pode não requerer um esquema de mapeamento. Neste caso, o updategram baseia-se no esquema de mapeamento padrão.

O updategram seguinte demonstra o mapeamento implícito. Neste exemplo, o updategram insere um novo cliente na tabela Sales.Customer. Como este updategram utiliza mapeamento implícito, o <elemento Sales.Customer> corresponde à tabela Sales.Customer e os atributos CustomerID e SalesPersonID correspondem às 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 especificar um esquema de mapeamento (seja XSD ou XDR), o updategram usa o esquema para determinar as tabelas e colunas da base de dados que devem ser atualizadas.

Se o updategram realizar uma atualização complexa (por exemplo, inserir registos em múltiplas tabelas com base na relação pai-filho especificada no esquema de mapeamento), deve fornecer explicitamente o esquema de mapeamento usando o atributo schema de mapeamento contra o qual o updategram executa.

Como um updategram é um modelo, o caminho especificado para o esquema de mapeamento no updategram é relativo à localização do ficheiro template (relativamente ao local onde o updategram está armazenado). Para mais informações, consulte Especificar um Esquema de Mapeamento Anotado num Updategram (SQLXML 4.0).

Mapeamento centrado em elementos e atributos em Updategrams

Com o mapeamento por defeito (quando o esquema de mapeamento não é especificado no updategram), os elementos do updategram mapeiam para tabelas e os elementos filhos (no caso do mapeamento centrado no elemento) e os atributos (no caso do mapeamento centrado no atributo) mapeiam para colunas.

Mapeamento centrado em elementos

Num updategram centrado no elemento, um elemento contém elementos filhos que denotam as propriedades do elemento. Como exemplo, consulte o seguinte updategram. O <elemento Pessoa.Contacto> contém os <elementos filhos Primeiro> Nome e <Apelido> . Estes elementos filhos são propriedades do <elemento Pessoa.Contacto> .

Como este updategram não especifica um esquema de mapeamento, o updategram utiliza mapeamento implícito, onde o <elemento Person.Contact> corresponde à tabela Person.Contact e os seus elementos filhos mapeiam para as colunas Primeiro Nome e Apelido.

<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 atributos

Numa aplicação centrada em atributos, os elementos têm atributos. O updategram seguinte utiliza mapeamento centrado em atributos. Neste exemplo, o <elemento Pessoa.Contacto> consiste nos atributos Primeiro Nome e Apelido . Estes atributos são as propriedades do <elemento Pessoa.Contacto> . Tal como no exemplo anterior, este updategram não especifica nenhum esquema de mapeamento, pelo que depende do mapeamento implícito para mapear o <elemento Person.Contact> para a tabela Person.Contact e os atributos do elemento para as respetivas 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>  

Utilização tanto de mapeamento centrado no elemento como no atributo

Pode especificar uma combinação de mapeamento centrado no elemento e no atributo, como mostrado no updategram seguinte. Note que o <elemento Pessoa.Contacto> contém tanto um atributo como um elemento filho. Além disso, este updategram baseia-se em mapeamento implícito. Assim, o atributo Primeiro Nome e o <elemento filho Apelido> mapeiam para colunas correspondentes na tabela Pessoa.Contacto.

<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>  

Trabalhar com Caracteres Válidos no SQL Server mas Não Válidos em XML

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

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

De forma semelhante, pode ser necessário especificar nomes de elementos em três partes, como <[base de dados].[ proprietário]. [mesa].> Como os caracteres de parêntese ([ e ]) não são válidos em XML, deve especificar isto como <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>, onde _x005B_ é a codificação do colchete esquerdo ([) e _x005D_ é a codificação do colchete direito (]).

Execução de Updategrams

Como um updategram é um template, todos os mecanismos de processamento de um template aplicam-se ao updategram. Para SQLXML 4.0, pode executar um updategram de uma das seguintes formas:

  • Submetendo-o num comando ADO.

  • Submetendo-o como um comando OLE DB.

Ver também

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