2010-07-08 6 views
1

Как установить ограничение CHECK на столбец, чтобы его диапазон допустимых значений поступал из другой таблицы без жесткого кодирования?SQL Server - ограничение CHECK для столбца, в котором значения поступают из другой таблицы

Вот упрощенный пример:

OneManyTable 
RoleID TaskID 
10  Val1 
10  Val2 
20  Val1 
20  Val2 


MetaDataTable 
pkID Class Value 
1  A  Val1 
2  A  Val2 
3  B  Val3 
4  B  Val4 

Я хочу поставить проверочное ограничение на колонке OneManyTable.TaskID таким образом, что допустимые значения приходят из колонки Другой ТАБЛИЦЫ, то есть от MetadataTable.Value где MetadataTable.class = «A '

Я уже пытался создать СНЕСК формата

TaskID in (Select Value FROM MetadataTable where class= 'A') 

НО ЭТО НЕ ПОДДЕРЖИВАЕТСЯ.

С другой стороны TaskID в ('Val1', 'Val2') работает как контрольное ограничение в SQL2k8 (не в SQL2000!), Но его неприемлемо из-за жесткого кодирования.

Как достичь того, что я хочу, будь то ограничение CHECK или какой-либо другой причудливый механизм, о котором я не знаю?

PS. Должно быть на стороне базы данных, проверка на стороне клиента, как мне было предложено кем-то.

ответ

4

Возможно, это не очень хорошая практика, но вы можете написать определенную пользователем функцию, которая принимает ваш TaskID в качестве параметра и оценивает значение true или false в зависимости от того, попадает ли TaskID в диапазон, указанный здесь в вашем MetaDataTable.

Это позволит вам получить функциональность, которую вы ищете. Ограничения CHECK на самом деле просто предназначены для простых функций, предназначенных для ограничения диапазона столбцов, и их поведение было разработано с учетом этого, поэтому вы не можете писать подзапросы в пределах ограничения проверки на SQL-сервере.

Однако вы можете написать инструкцию SELECT в пределах определенной пользователем функции и вызвать ее из ограничения CHECK.

+1

Итак, я написал свой udf и создал ограничение формы dbo.udfValidateTaskIDRange (TaskID) = 1. Спасибо, что поместили меня на правильный трек, полные отметки. Не уверен, что ваш «не лучший комментарий»; Если все эталонные данные находятся в одной таблице, это идеальная практика, чтобы попасть в :-) Лучше, чем ничего не использовать, и пусть ошибки ползут в вашу таблицу. – joedotnot

+0

Мы используем эту конструкцию экономно, и она очень хорошо работает для нас. –

+0

@Joedotnot Да, если правильно использовать эту технику, это действительно полезно - это просто очень легко злоупотреблять/злоупотреблять, поэтому я написал, что это не может быть хорошей привычкой.Пока вы будете осторожны в том, как вы разрабатываете свои UDF, вы будете в хорошей форме. – Aaronontheweb

2

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

проверочных ограничения действительно предназначены только для определения

  • минимальных или максимальных значений
  • диапазоны
  • перечислений из заданного набора значений

Так что я не думаю, что вы можете сделайте то, что вы пытаетесь сделать, потому что это действительно неправильная функция, которую вы пытаетесь использовать для этого.