Restrições exclusivas em colunas anuláveis ​​no SQL Server 2005

12

Neste projeto em que estou trabalhando, preciso definir um campo específico para ser único (não é um problema!), Mas se o campo for nulo, desejo que a restrição seja ignorada. No Sql Server 2008, uso o índice filtrado como mostrado abaixo, mas isso não está disponível nas versões anteriores do SQL!

CREATE UNIQUE NONCLUSTERED INDEX User_UserName_IUC
ON [User] (pinNr)
WHERE UserName IS NOT NULL

Mas acho que isso não está disponível no SQL Server 2005. De fato, esta postagem do blog indica que há uma solução alternativa usando um gatilho para verificar a exclusividade. Alguém tem um exemplo disso? ou talvez uma alternativa?

Infelizmente, a atualização para o SQl Server 2008 não é uma opção para esse cliente em particular !!

Aim Kai
fonte

Respostas:

18

Na verdade, eu tive que fazer algo assim uma vez. Envolveu a criação de uma coluna computada que leva o valor da coluna Exclusivo quando não existe NULLe o valor da chave primária (com alguma outra lógica para tornar impossível colidir com os valores da coluna exclusiva) e a criação do índice exclusivo em essa coluna. Você pode ver um exemplo disso e do método de disparo aqui .

Lamak
fonte
7

Você pode criar uma visualização (onde Nome de usuário não é nulo) e colocar um índice exclusivo na visualização. Você nunca precisará usar a visualização, ela existe apenas para isso.

Você também pode usar essa técnica para impor exclusividade em várias tabelas, onde normalmente seria impossível.

Meff
fonte
2
As visualizações indexadas não requerem a edição corporativa. No entanto, eles exigem que você use a dica de consulta WITH (NOEXPAND) para forçar o otimizador de consulta da edição padrão a usar a exibição indexada em vez da consulta subjacente.
Jeremiah Peschka 15/01
3
Nesse caso, embora o único ponto de vista seja impor a restrição exclusiva, essa é uma abordagem perfeitamente válida / comum.
Martin Smith
2
Editado para remover informações incorretas sobre o Enterprise Edition que é necessário.
Meff
@Meff obrigado por tomar o tempo para responder aos comentários aqui - Espero que não será um estranho para o site: você pode estar interessado em estas questões :)
Jack diz tentativa topanswers.xyz