В последнее время я столкнулся с подобной проблемой и нашел классный способ справиться с ней. У меня была таблица, в которой могло быть несколько строк для одного идентификатора, но только ОДНА из них могла быть помечена как основная.
В SQL Server 2008 вы сможете создать частичный уникальный индекс примерно так:
create unique index IX on MyTable(name) where isDeleted = 0;
Однако в SQL Server 2005 вы можете выполнить это немного больше. Хитрость заключается в том, чтобы создать представление, отображающее только те строки, которые не были удалены, а затем создать уникальный кластеризованный индекс:
create view MyTableNotDeleted_vw
with schema_binding /* Must be schema bound to create an indexed view */
as
select name
from dbo.MyTable /* Have to use dbo. for schema bound views */
where isDeleted = 0;
GO
create unique clustered index IX on MyTableNotDeleted_vw ( name );
Это эффективно создаст уникальное ограничение, влияющее только на строки, которые еще не были удалены, и, вероятно, будет работать лучше, чем пользовательский триггер!