SQL Server - проверьте ограничение на столбец, где значения происходят из другой таблицы

StackOverflow https://stackoverflow.com/questions/3200795

Вопрос

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

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

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 столбец такой, что приемлемые значения поступают из столбца других таблиц, то есть из метаданатабие. Valueue, где метадатат .Class= 'A'

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

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

Но это не поддерживается.

С другой стороны, TaskiD в ('val1', 'val2') работает как ограничение проверки в SQL2K8 (не в SQL2000!), Но это не приемлемо из-за жесткого класса.

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top