Coleções de esquema XML (SQL Server)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Como descrito no artigo xml (Transact-SQL), o SQL Server fornece armazenamento nativo de dados XML por meio do tipo de dados xml. Opcionalmente, é possível associar esquemas XSD a uma variável ou a uma coluna do tipo xml por meio de uma coleção de esquemas XML. A coleção de esquema XML armazena os esquemas XML importados e, em seguida, é usada para fazer o seguinte:

  • Validar instâncias XML

  • Definir o tipo dos dados XML conforme eles são armazenados no banco de dados

A coleção de esquema XML é uma entidade de metadados como uma tabela no banco de dados. É possível criar, modificar e descartá-la. Esquemas especificados em uma instrução CREATE XML SCHEMA COLLECTION (Transact-SQL) são importadas automaticamente no objeto da coleção de esquema XML recém-criado. É possível importar esquemas adicionais ou componentes do esquema em um objeto de coleção existente no banco de dados usando a instrução ALTER XML SCHEMA COLLECTION (Transact-SQL) .

Como descrito no artigo XML tipado vs. não tipado, o XML armazenado em uma coluna ou variável à qual um esquema está associado é denominado XML tipado, porque o esquema fornece as informações necessárias do tipo de dados para os dados da instância. O SQL Server usa essas informações de tipo para otimizar o armazenamento de dados.

O mecanismo do processamento de consultas também usa o esquema para verificação de tipo e otimizar modificação de dados e consultas.

Além disso, o SQL Server usa a coleção de esquema XML associada, xml tipado, para validar a instância XML. Se a instância XML estiver de acordo com o esquema, o banco de dados permitirá que a instância seja armazenada no sistema com suas informações de tipo. Caso contrário, a instância será rejeitada.

É possível usar a função intrínseca XML_SCHEMA_NAMESPACE para recuperar a coleção de esquema que está armazenada no banco de dados. Para obter mais informações, veja Exibir uma coleção de esquemas XML armazenados.

Também é possível usar a coleção de esquema XML para digitar variáveis, parâmetros e colunas XML.

DDL para gerenciar coleções de esquemas

Você pode criar coleções de esquemas XML no banco de dados e associá-las a variáveis e colunas do tipo xml . Para gerenciar coleções de esquema no banco de dados, o SQL Server fornece as seguintes instruções DDL:

Para usar uma coleção de esquema XML e os esquemas contidos nela, você deve primeiro criar a coleção e os esquemas usando a instrução CREATE XML SCHEMA COLLECTION. Após a criação da coleção de esquema, é possível criar variáveis e colunas do tipo xml e associar a coleção de esquema a elas. Depois que uma coleção de esquema é criada, são armazenados vários componentes de esquema nos metadados. Também é possível usar ALTER XML SCHEMA COLLECTION para adicionar mais componentes a esquemas existentes ou adicionar novos esquemas a uma coleção existente.

Para descartar a coleção de esquema, use a instrução DROP XML SCHEMA COLLECTION. Ela descarta todos os esquemas que estão contidos na coleção e remove o objeto da coleção. Antes de descartar uma coleção de esquema, as condições descritas em DROP XML SCHEMA COLLECTION (Transact-SQL) devem ser atendidas.

Reconhecer componentes de esquema

Quando a instrução CREATE XML SCHEMA COLLECTION é usada, vários componentes de esquema são importados no banco de dados. Os componentes de esquema incluem elementos, atributos e definições de tipo de esquema. Quando a instrução DROP XML SCHEMA COLLECTION é usada, a coleção completa é removida.

CREATE XML SCHEMA COLLECTION salva os componentes do esquema em várias tabelas do sistema.

Por exemplo, considere o seguinte esquema:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="uri:Cust_Orders2"
            xmlns="uri:Cust_Orders2" >
  <xsd:attribute name="SomeAttribute" type="xsd:int" />
  <xsd:complexType name="SomeType" />
  <xsd:complexType name="OrderType" >
    <xsd:sequence>
      <xsd:element name="OrderDate" type="xsd:date" />
      <xsd:element name="RequiredDate" type="xsd:date" />
      <xsd:element name="ShippedDate" type="xsd:date" />
    </xsd:sequence>
    <xsd:attribute name="OrderID" type="xsd:ID" />
    <xsd:attribute name="CustomerID"  />
    <xsd:attribute name="EmployeeID"  />
  </xsd:complexType>
  <xsd:complexType name="CustomerType" >
     <xsd:sequence>
        <xsd:element name="Order" type="OrderType"
                     maxOccurs="unbounded" />
       </xsd:sequence>
      <xsd:attribute name="CustomerID" type="xsd:string" />
      <xsd:attribute name="OrderIDList" type="xsd:IDREFS" />
  </xsd:complexType>
  <xsd:element name="Customer" type="CustomerType" />
</xsd:schema>

O esquema anterior mostra os diferentes tipos de componentes que podem ser armazenados no banco de dados. Esses esquemas incluem SomeAttribute, SomeType, OrderType, CustomerType, Customer, Order, CustomerID, OrderID, OrderDate, RequiredDatee ShippedDate.

Categorias de componentes

Os componentes de esquema armazenados no banco de dados se enquadram nas seguintes categorias:

  • ELEMENT

  • ATTRIBUTE

  • TYPE (para tipos simples ou complexos)

  • ATTRIBUTEGROUP

  • MODELGROUP

Por exemplo:

  • SomeAttribute é um componente ATTRIBUTE.

  • SomeType, OrderType e CustomerType são componentes TYPE.

  • Customer é um componente ELEMENT.

Quando você importa um esquema no banco de dados, o SQL Server não armazena o próprio esquema. Em vez disso, o SQL Server armazena os vários componentes individuais. Ou seja, a tag <Schema> não é armazenada, apenas os componentes que estão definidos dentro dela são preservados. Todos os elementos do esquema não são preservados. Se a tag <Schema> contiver atributos que especificam o comportamento padrão de seus componentes, esses atributos serão movidos para os componentes do esquema dentro dela durante o processo de importação, conforme mostrado na tabela a seguir.

Nome do atributo Comportamento
attributeFormDefault O atributo form aplicado a todas as declarações de atributo no esquema em que ele ainda não está presente e o valor é definido como o valor do atributo attributeFormDefault .
elementFormDefault O atributo form aplicado a todas as declarações de elemento no esquema em que ele ainda não está presente e o valor é definido como o valor do atributo elementFormDefault .
blockDefault O atributo block aplicado a todas as declarações de elemento e às definições de tipo em que ele ainda não está presente e o valor é definido como o valor do atributo blockDefault .
finalDefault O atributo final aplicado a todas as declarações de elemento e às definições de tipo em que ele ainda não está presente e o valor está definido como o valor do atributo finalDefault .
targetNamespace Informações sobre os componentes que pertencem ao namespace de destino são armazenadas nos metadados.

Permissões em uma coleção de esquema XML

Você deve ter as permissões necessárias para fazer o seguinte:

  • Criar/carregar a coleção de esquema XML

  • Modificar a coleção de esquema XML

  • Descartar a coleção de esquema XML

  • Usar a coleção de esquema XML para digitar colunas, variáveis e parâmetros de tipo xml ou usá-la em restrições de tabela ou coluna

O modelo de segurança do SQL permite a permissão CONTROL em todos os objetos. O usuário autorizado dessa permissão obtém todas as outras permissões no objeto. O proprietário do objeto também tem todas as permissões no objeto.

O proprietário e o usuário autorizado da permissão CONTROL em um objeto podem conceder qualquer permissão no objeto. Um usuário que não é um proprietário e não tem a permissão CONTROL ainda pode conceder permissão em um objeto quando WITH GRANT OPTION estiver especificada. Por exemplo, assuma que o Usuário A tem a permissão REFERENCES na coleção de esquema XML S, através da WITH GRANT OPTION, mas nenhuma outra permissão em S. O Usuário A pode conceder a permissão REFERENCES ao Usuário B na coleção de esquema S.

O modelo de segurança também permite permissões para criar e usar coleções de esquema XML ou transferir a propriedade de um usuário para outro. Os artigos a seguir descrevem as permissões de coleção de esquema XML.

Obter informações sobre esquemas XML e coleções de esquemas

Coleções de esquema XML são enumeradas na exibição do catálogo sys.xml_schema_collections. A coleção de esquema XML sys é definida pelo sistema. Ela contém os namespaces predefinidos que podem ser usados em todas as coleções de esquema XML definidas pelo usuário sem precisar carregá-las explicitamente. Essa lista contém os namespaces para xml, xs, xsi, fn e xdt. Outras duas exibições do catálogo são sys.xml_schema_namespaces, que enumera todos os namespaces dentro de cada coleção de esquema XML, e sys.xml_components, que enumera todos os componentes do esquema XML dentro de cada esquema XML.

A função interna XML_SCHEMA_NAMESPACE, schemaName, XmlSchemacollectionName, namespace-uri, produz uma instância de tipo de dados xml. Essa instância contém fragmentos de esquema XML estão contidos em uma coleção de esquema XML, exceto os esquemas XML predefinidos.

É possível enumerar o conteúdo de uma coleção de esquema XML das seguintes maneiras:

  • Escreva consultas Transact-SQL nas exibições do catálogo apropriadas para coleções de esquema XML.

  • Use as funções internas XML_SCHEMA_NAMESPACE(). É possível aplicar métodos de tipo de dados xml na saída dessa função. No entanto, não é possível modificar os esquemas XML subjacentes.

Esses são ilustrados nos exemplos a seguir.

Exemplos

Enumerar os namespaces XML em uma coleção de esquemas XML

Use a consulta a seguir para a coleção de esquema XML myCollection:

SELECT XSN.name
FROM    sys.xml_schema_collections XSC JOIN sys.xml_schema_namespaces XSN
    ON (XSC.xml_collection_id = XSN.xml_collection_id)
WHERE    XSC.name = 'myCollection';

Enumerar o conteúdo de uma coleção de esquemas XML

A instrução a seguir enumera o conteúdo da coleção de esquema XML myCollection dentro do esquema relacional, dbo.

SELECT XML_SCHEMA_NAMESPACE (N'dbo', N'myCollection');

Esquemas XML individuais dentro da coleção podem ser obtidos como instâncias de tipo de dados xml especificando o namespace de destino como o terceiro argumento para XML_SCHEMA_NAMESPACE(). Isso é mostrado no exemplo a seguir.

Gerar um esquema especificado com base em uma coleção de esquemas XML

A instrução a seguir gera o esquema XML com o namespace de destino pretendido https://www.microsoft.com/was-books da coleção de esquemas XML myCollection dentro do esquema relacional, dbo.

SELECT XML_SCHEMA_NAMESPACE (N'dbo', N'myCollection',
N'https://www.microsoft.com/was-books')

Consultar esquemas XML

É possível consultar esquemas XML carregados em coleções de esquema XML das seguintes maneiras:

  • Escreva consultas Transact-SQL em exibições do catálogo para namespaces de esquema XML.

  • Crie uma tabela que contém uma coluna de tipo de dados xml para armazenar seus esquemas XML e também para carregá-los no sistema de tipo XML. É possível consultar a coluna XML usando os métodos de tipo de dados xml . Além disso, é possível construir um índice XML nessa coluna. No entanto, com essa abordagem, o aplicativo deve manter consistência entre os esquemas XML armazenados na coluna XML e no sistema de tipo XML. Por exemplo, se você descartar o namespace do esquema XML do sistema de tipo XML, também deverá descartá-lo da tabela para preservar a consistência.

Confira também