Как установить ограничение 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. Должно быть на стороне базы данных, проверка на стороне клиента, как мне было предложено кем-то.
Итак, я написал свой udf и создал ограничение формы dbo.udfValidateTaskIDRange (TaskID) = 1. Спасибо, что поместили меня на правильный трек, полные отметки. Не уверен, что ваш «не лучший комментарий»; Если все эталонные данные находятся в одной таблице, это идеальная практика, чтобы попасть в :-) Лучше, чем ничего не использовать, и пусть ошибки ползут в вашу таблицу. – joedotnot
Мы используем эту конструкцию экономно, и она очень хорошо работает для нас. –
@Joedotnot Да, если правильно использовать эту технику, это действительно полезно - это просто очень легко злоупотреблять/злоупотреблять, поэтому я написал, что это не может быть хорошей привычкой.Пока вы будете осторожны в том, как вы разрабатываете свои UDF, вы будете в хорошей форме. – Aaronontheweb