2010-08-25 4 views
1

С использованием SQL Server 2008 у меня есть требование, чтобы адреса электронной почты в моей таблице пользователя были уникальными, но адреса электронной почты в моем приложении не требуются. Я пытался сделать требуемые адреса электронной почты, но я просто не могу заставить клиента сдвинуться с места на этом. Каков наилучший способ создания этого ограничения? Если я добавлю ограничение, как выглядит ограничение? Если я добавлю триггер до вставки, как это выглядит?Уникальный, необязательный столбец в SQL Server 2008

Это приложение будет работать на многосерверной веб-ферме, и есть несколько точек входа. Уровень приложения lock() { } не является отличным вариантом. Я делаю выбор и проверку того, что письмо не существует из кода перед выполнением операции вставки, чтобы дать немедленную обратную связь с пользователем. Тем не менее, мне бы очень понравилось решение на уровне базы данных. На всякий случай.

Я использую ORM (NHibernate с AutoMapping), поэтому я не хочу вставлять или обновлять записи хранимой процедурой.

ответ

3

Используйте уникальный отфильтрованный индекс:

create table Foo (
Id int not null identity(1,1) primary key 
, Name varchar(256) null 
, Address varchar(max) null 
, Email varchar(256) null); 

create index ndxFooEmail unique on Foo(Email) 
where Email is not null; 

Это верный выстрел 100% пуленепробиваемый способ гарантировать уникальность необязательного значения. Уникальность будет выполняться на сервере базы данных, ORM/DAL не нужно беспокоиться об этом, просто обработайте ошибку, если уникальное ограничение будет нарушено, а не попытаться дублировать ограничение в ORM/DAL (на самом деле невозможно делайте это правильно при параллелизме).

См. Filtered Index Design Guidelines для получения более подробной информации об отфильтрованных индексах SQL Server 2008.

+0

Boom! Выстрел в голову! –

Смежные вопросы