Eu quero resolver um monte de tabelas que tinham relacionamentos pai->filho->neto em uma única tabela usando identificadores de hierarquia. Aqui está o que eu criei com base no que eu tinha.
CREATE TABLE [dbo].[tbl_server_group]
(
[refid] [int] IDENTITY(1,1) NOT NULL,
[refhid] [hierarchyid] NOT NULL,
[reflvl] AS refhid.GetLevel() PERSISTED,
[refdate] [datetime] NOT NULL DEFAULT GETDATE(),
[refname] [varchar](50) NOT NULL
)
Meu problema é que preciso exigir que o refname seja exclusivo, mas apenas dentro do contêiner em que está. Como estou usando isso para representar servidores, queria emular uma espécie de árvore DNS, mas adicionar outras camadas para isso também. Meu exemplo sendo o seguinte:
ROOT
| something.com
|| www
||| index.html
|| staging
||| testbed.php
| someotherthing.com
|| test
||| index.html
Quero garantir que algo.com tenha apenas um "www" e que www tenha apenas um "index.html".
Existe alguma maneira de fazer isso com restrições? Se não, existe uma maneira eficiente de forçar a exclusividade?
Obrigado
Se você adicionar outra coluna para o ancestral, por exemplo
Você pode garantir que haja apenas um 'www' por pai. Você pode criar um índice semelhante para 'index.html'.
Obviamente, isso vai além do primeiro nível (www) e para filhos de
www
(index.html), mas não vejo por que as restrições expandidas não funcionarão.Se você teve que implementá-lo exatamente como especificado, terá que recorrer ao uso de um gatilho.
Nota: Isso faz uso do índice filtrado do SQL Server, portanto, você deve obter as configurações de SET corretas para qualquer processo que toque nessa tabela.