hierarchyid (Transact-SQL)

hierarchyid é um tipo de dados de tamanho variável. Use hierarchyid para representar posição em uma hierarquia. Uma coluna de tipo hierarchyid não representa automaticamente uma árvore. Depende de o aplicativo gerar e atribuir valores hierarchyid de tal modo que a relação desejada entre as linhas seja refletida nos valores.

Um valor do tipo de dados hierarchyid representa uma posição em uma hierarquia de árvore. Os valores para hierarchyid têm as seguintes propriedades:

  • Extremamente compacto

    O número médio de bits necessários para representar um nó em uma árvore com n nós depende da média de fanout (o número médio de filhos de um nó). Para fanouts pequenos (0-7), o tamanho é de aproximadamente 6*logAn bits, onde A é o fanout médio. Um nó em uma hierarquia organizacional de 100.000 pessoas com um fanout médio de 6 níveis usa cerca de 38 bits. Isso é arredondado para 40 bits, ou 5 bytes, para armazenamento.

  • A comparação está na ordem de profundidade

    Dado dois valores hierarchyid a e b, a<b significa que a vem antes de b em uma passagem de profundidade da árvore. Índices em tipos de dados hierarchyid estão na ordem de profundidade e os nós que estão próximos um do outro são armazenados em uma passagem de profundidade próximos um do outro. Por exemplo, os filhos de um registro são armazenados adjacentes àquele registro. Para obter mais informações, consulte Usando tipos de dados hierarchyid (Mecanismo de Banco de Dados).

  • Suporte a inserções e exclusões arbitrárias

    Usando o método GetDescendant, é sempre possível gerar um irmão à direita de qualquer nó determinado, à esquerda de qualquer nó determinado, ou entre dois irmãos. A propriedade de comparação é mantida quando um número arbitrário de nós é inserido ou excluído da hierarquia. A maioria das inserções e exclusões preserva a propriedade de densidade. Porém, inserções entre dois nós produzirão valores hierarchyid com uma representação ligeiramente menos compacta.

  • A codificação usada no tipo hierarchyid se limita a 892 bytes. Por conseguinte, nós que têm muitos níveis em sua representação para se ajustarem a 892 bytes não podem ser representados pelo tipo hierarchyid.

O tipo hierarchyid está disponível a clientes CLR como o tipo de dados SqlHierarchyId.

Comentários

O tipo hierarchyid codifica informações logicamente sobre um único nó em uma árvore de hierarquia codificando o caminho da raiz da árvore para o nó. Esse caminho é representado logicamente como uma seqüência de rótulos de nós de todos os filhos visitados depois da raiz. Uma barra inicia a representação e um caminho que visita apenas a raiz é representado por uma barra única. Para níveis abaixo da raiz, cada rótulo é codificado como uma seqüência de inteiros separados por pontos. A comparação entre filhos é executada comparando-se as seqüências de inteiros separados por pontos na ordem alfabética. Cada nível é seguido por uma barra. Portanto, uma barra separa os pais de seus filhos. Por exemplo, são caminhos de hierarchyid válidos, respectivamente, de comprimentos 1, 2, 2, 3 e 3 níveis:

  • /

  • /1/

  • /0.3.-7/

  • /1/3/

  • /0.1/0.2/

Podem ser inseridos nós em qualquer local. Nós inseridos depois de /1/2/, mas antes de /1/3/ podem ser representados como /1/2.5/. Nós inseridos antes de 0 têm a representação lógica como um número negativo. Por exemplo, um nó que vem antes de /1/1/ pode ser representado como /1/-1/. Nós não podem ter zeros à esquerda. Por exemplo, /1/1.1/ são válidos, mas /1/1.01/ não são válidos. Para evitar erros, insira nós usando o método GetDescendant.

Conversão de tipo de dados

O tipo de dados hierarchyid pode ser convertido em outros tipos de dados, como segue:

  • Use o método ToString () para converter o valor de hierarchyid para a representação lógica como tipo de dados nvarchar(4000).

  • Use Read () e Write () para converter hierarchyid para varbinary.

  • Não há suporte para conversão de hierarchyid para XML. Para transmitir parâmetros hierarchyid por SOAP, primeiro converta-os em cadeias de caracteres. Uma consulta com a cláusula FOR XML falhará em uma tabela com hierarchyid, a menos que a coluna seja, primeiro, convertida para um tipo de dados de caractere.

Atualizando bancos de dados

Quando um banco de dados é atualizado para SQL Server 2008, os novo assembly e o tipo de dados hierarchyid são instalados automaticamente. Regras do supervisor de atualização detectam qualquer tipo de usuário ou assemblies com nomes conflitantes. O supervisor de atualização aconselhará renomear quaisquer assemblies conflitantes, bem como qualquer tipo de conflito, ou usar nomes de duas partes no código para fazer referência ao tipo de usuário preexistente.

Se uma atualização de banco de dados detectar um assembly de usuário com nome conflitante, ele o renomeará automaticamente e o colocará no banco de dados em modo de suspeição.

Se um tipo de usuário com nome conflitante existir durante a atualização, nenhuma etapa especial será efetuada. Depois da atualização, existirão ambos os tipos de usuário, antigo e novo. O tipo de usuário só estará disponível através de nomes de duas partes.

Usando colunas hierarchyid em tabelas replicadas

Podem ser usadas colunas do tipo hierarchyid em qualquer tabela replicada. Os requisitos para seu aplicativo dependem de a replicação ser unidirecional ou bidirecional e das versões de SQL Server utilizadas.

Replicação unidirecional

Replicação unidirecional inclui replicação de instantâneo, replicação transacional e replicação de mesclagem, nas quais não são feitas alterações no Assinante. O modo de funcionamento das colunas hierachyid com replicação unidirecional depende da versão de SQL Server executada pelo Assinante.

  • Um Editor SQL Server 2008 pode replicar colunas hierachyid para um Assinante SQL Server 2008 sem qualquer consideração especial.

  • Um Publicador do SQL Server 2008 deve converter colunas hierarchyid para replicá-las para um Assinante que está executando SQL Server Compact 3.5 SP1 ou uma versão anterior do SQL Server. O SQL Server Compact 3.5 SP1 e versões anteriores do SQL Server não oferecem suporte para colunas hierarchyid. Ainda que esteja usando uma dessas versões, você poderá replicar dados para um Assinante. Para tanto, você deve definir uma opção de esquema ou o nível de compatibilidade de publicação (para replicação de mesclagem) a que a coluna pode ser convertida para um tipo de dados compatível. Para obter mais informações, consulte Usando várias versões do SQL Server em uma topologia de replicação.

Em ambos os cenários há suporte a filtragem de colunas. Inclui a filtragem de colunas hierarchyid. Há suporte a filtragem de linhas desde que o filtro não contenha uma coluna hierarchyid.

Replicação bidirecional

Replicação bidirecional inclui replicação transacional com assinaturas de atualização, replicação transacional ponto a ponto e replicação de mesclagem, nas quais não são feitas alterações no Assinante. A replicação lhe permite configurar uma tabela com colunas hierarchyid para replicação bidirecional. Observe os requisitos e considerações a seguir.

  • O Editor e todos os Assinantes devem estar executando SQL Server 2008.

  • A replicação reproduz os dados como bytes e não executa nenhuma validação para assegurar a integridade da hierarquia.

  • A hierarquia das alterações feitas na origem (Assinante ou Editor) não é mantida quando eles são replicados para o destino.

  • Os valores de hash das colunas hierarchyid são específicos ao banco de dados no qual são gerados. Portanto, o mesmo valor poderia ser gerado no Editor e Assinante, mas poderia ser aplicado a linhas diferentes. A replicação não verifica se existe essa condição e não há nenhum modo interno de dividir os valores das colunas hierarchyid, como há para colunas IDENTITY. Os aplicativos devem usar restrições ou outros mecanismos para evitar tais conflitos não detectados.

  • É possível que as linhas que se encontram inseridas no Assinante se tornem órfãs. A linha pai da linha inserida pode ter sido excluída no Editor. Isso resulta em um conflito não detectado quando a linha do Assinante é inserida no Editor.

  • Filtros de colunas não podem filtrar colunas hierarchyid que não permitem valor nulo: as inserções do Assinante falharão, porque não há nenhum valor padrão para a coluna hierarchyid do Publicador.

  • Há suporte a filtragem de linhas desde que o filtro não contenha uma coluna hierarchyid.