Neste projeto em que estou trabalhando, preciso definir um campo específico para ser exclusivo (sem problema!), Mas se o campo for nulo, quero que a restrição seja ignorada. No Sql Server 2008 eu uso o índice filtrado conforme mostrado abaixo, mas isso não está disponível em versões anteriores do SQL!
CREATE UNIQUE NONCLUSTERED INDEX User_UserName_IUC
ON [User] (pinNr)
WHERE UserName IS NOT NULL
Mas não acho que isso esteja disponível no SQL Server 2005. Na verdade, esta postagem no 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 atualizar para SQL Server 2008 não é uma opção para este cliente em particular!!
Na verdade, eu tive que fazer algo assim uma vez. Envolvia a criação de uma coluna computada que leva o valor da coluna Unique quando não é
NULL
e o valor da chave primária (com alguma outra lógica para tornar impossível o conflito com os valores na coluna exclusiva) e fazer o índice exclusivo em aquela coluna. Você pode ver um exemplo disso e do método trigger aqui .Você pode criar uma exibição (onde o nome de usuário não é nulo) e colocar um índice exclusivo na exibição. Você nunca precisará usar a view, ela existirá apenas para isso.
Você também pode usar essa técnica para impor exclusividade em várias tabelas, onde normalmente seria impossível.