Partilhar via


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

Você pode modificar (inserir, atualizar ou excluir) um banco de dados do Microsoft SQL Server a partir de um documento XML existente usando um diagrama de atualização ou a função OPENXMLTransact-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çãoObservação

Esta documentação parte do pressuposto de que você esteja familiarizado com suporte a modelos e ao esquema de mapeamento no 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 (Substituídos no SQLXML 4.0).

Namespaces necessários no diagrama de atualização

As palavras-chave de um diagrama de atualização, como <sync>, <before> e <after>, 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 updategram.

Revisando a sintaxe

Um diagrama de atualização é um modelo com blocos <sync>, <before> e <after>, que formam a sua sintaxe. 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:

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

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

  • <sync>
    Contém os blocos <before> e <after>. Um bloco <sync> pode conter mais de um conjunto de blocos <before> e <after>. Se houver mais de um conjunto de blocos <before> e <after>, estes blocos (até mesmo se estiverem vazios) deverão ser especificados em pares. Além disso, um diagrama de atualização pode ter mais de um bloco <sync>. Cada bloco <sync> é uma unidade de transação (que significa que é feito tudo no bloco <sync> ou nada é feito). Se você especificar vários blocos <sync> em um diagrama de atualização, a falha de um bloco <sync> não afetará os outros blocos <sync>.

Se um diagrama de atualização exclui, insere ou atualiza uma instância de registro, isto depende dos conteúdos dos blocos <before> e <after> :

  • Se uma instância de registro aparecer somente no bloco <before> sem uma instância correspondente no bloco <after>, o diagrama de atualização executará uma operação de exclusão.

  • Se uma instância de registro aparecer somente no bloco <after> sem uma instância correspondente no bloco <before> , será uma operação de inserção.

  • Se uma instância de registro aparecer no bloco <before> e tiver uma instância correspondente no bloco <after>, será uma operação de atualização. Neste caso, o diagrama de atualização atualiza a instância de registro com os valores que são especificados no bloco <after>.

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 diagrama de atualização assumirá um mapeamento implícito (o mapeamento padrão), em que cada elemento no bloco <before> ou no bloco <after> será mapeado para uma tabela e cada elemento filho ou atributo será 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 este diagrama de atualização usa mapeamento implícito, o elemento <Sales.Customer> é mapeado para a tabela Sales.Customer e os atributos CustomerID e SalesPersonID, 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 diagrama de atualização realizar uma atualização complexa (por exemplo, inserindo registros em várias tabelas com base no relacionamento pai-filho especificado no esquema de mapeamento), você deverá fornecer explicitamente o esquema de mapeamento usando o atributo mapping-schema sobre o qual o diagrama de atualização será 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 diagrama de atualização (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 for especificado no diagrama de atualização), os elementos do diagrama de atualização são mapeados para tabelas e os elementos-filho (no caso do mapeamento centrado em elementos) e os atributos (no caso do mapeamento centrado em atributos) 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 **<Nome>**e <Sobrenome>. Estes elementos filhos são propriedades do elemento <Person.Contact>.

Como este diagrama de atualização não especifica um esquema de mapeamento, o diagrama de atualização usa o mapeamento implícito, em que o elemento <Person.Contact> é mapeado para a tabela Person.Contact e seus elementos-filhos 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 Nome e Sobrenome. Estes atributos são as propriedades do elemento <Person.Contact>. Como no exemplo anterior, este diagrama de atualização não especifica um esquema de mapeamento, então ele se baseia no implícito para mapear o elemento <Person.Contact> é para a tabela Person.Contact e os atributos dos elementos para as respectivas tabelas na coluna.

<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 Nome e o elemento filho <Sobrenome> são mapeados para as 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. Porém, este tipo de nome de tabela não é válido em XML.

Para codificar caracteres que sejam identificadores válidos no SQL Server mas não sejam identificadores válidos em XML, use '__xHHHH__' como valor de codificação, onde HHHH representa o código UCS-2 hexadecimal de quatro dígitos do caractere na ordem do primeiro bit mais significativo. Usando este 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 [Order Details] no SQL Server torna-se _x005B_Order_x0020_Details_x005D_ em XML.

De forma similar, poderia ser necessário especificar nomes de elemento de três partes, como <[database]. [owner]. [table]>. Como os caracteres de colchete ([ e ]) não são válidos em XML, você deve especificar esse nome 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.