2014-01-02 2 views
0

Я читал много сообщений здесь о SO о создании ограничений или индексированных представлений, но я никогда не писал сложного ограничения раньше, и я надеюсь, что кто-то скажет мне, лучший подход для этого. У меня в основном есть таблица со структурой вроде ниже, и в записи может быть только один активный администратор.SQL Server 2005 создает ограничение или индексированное представление

Id  Admin 
--  ------ 
1  1 
1  null 
1  null 
2  1 
2  null 
2  null 

Я начал писать только регулярное заявление ограничения, но быстро понял, что это не будет работать, потому что множество нулевых значений не являются уникальными. Есть ли способ изменить это ограничение, чтобы запретить/игнорировать нули?

ALTER TABLE dbo.table 
    ADD CONSTRAINT OnlyOneAdmin UNIQUE(Id, Admin) 

Основываясь на моих исследованиях кажется хорошим вариантом индексированный вид, но я обеспокоен тем, что создание этой точки зрения было бы ввести слишком много накладных расходов. И я не уверен, что нижеследующее представление структурировано правильно для достижения желаемых результатов.

CREATE VIEW AdminView WITH SCHEMABINDING AS 
    SELECT Admin 
    FROM dbo.table 
    WHERE Admin IS NOT NULL; 
GO 

CREATE UNIQUE CLUSTERED INDEX AdminUnique 
ON dbo.AdminView(Admin); 

Любые рекомендации приветствуются, заблаговременно.

Дополнительный вопрос: Было бы лучше использовать вычисленный столбец для этого?

+1

Не уверен, что это сработает, но это должно быть: 'Id' вместо' Admin': 'CREATE VIEW AdminView С СХЕМЫ ЗАПИСИ В КАЧЕСТВЕ SELECT Id FROM dbo.table WHERE Admin IS NOT NULL;' и 'CREATE UNIQUE CLUSTERED INDEX AdminUnique ON dbo.AdminView (Id); ' –

ответ

1

Я думаю, что вы хотите отфильтрованный индекс. К сожалению, доступна только в версиях 2008 и более поздних версий:

CREATE UNIQUE INDEX OnlyOneAdmin 
    ON dbo.table (Id) 
    WHERE Admin IS NOT NULL ; 

В 2005 году, это должно работать (пожалуйста, тест, у меня нет версии 2005 доступных, чтобы проверить это.) Это очень близко к коду у вас есть, но с Admin заменены Id в некоторых местах:

CREATE VIEW AdminView WITH SCHEMABINDING AS 
    SELECT Id 
    FROM dbo.table 
    WHERE Admin IS NOT NULL; 

CREATE UNIQUE CLUSTERED INDEX AdminUnique 
    ON dbo.AdminView (Id) ; 
+0

AFAIK, что недопустимо для SQL Server 2005. –

+0

@DaveZych К сожалению, я пропустил тег 2005 года. Удаление ответа. –

0

Вы можете создать при нажатии спускового на столе для обеспечения соблюдения этого требования.

После того, как вы обновите строку, чтобы быть новым администратором, ваш триггер будет настроен для обновления всех остальных строк, которые будут обычными пользователями.

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