SQL Server - ограничение CHECK для столбца, в котором значения берутся из другой таблицы - PullRequest
1 голос
/ 08 июля 2010

Как можно наложить ограничение 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

Я хочупоместить ограничение CHECK в столбец OneManyTable.TaskID таким образом, чтобы допустимые значения исходили из столбца другой таблицы, т.е. из MetadataTable.Value, где MetadataTable.class = 'A'

Я уже пытался создать ограничение CHECK в формате

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 08 июля 2010

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

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

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

2 голосов
/ 08 июля 2010

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

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

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

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

...